diff --git a/manifests/pathcompservice.yaml b/manifests/pathcompservice.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b5316e22f1eefd4177ae33f4fc89da256f65bff8
--- /dev/null
+++ b/manifests/pathcompservice.yaml
@@ -0,0 +1,64 @@
+# 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.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: pathcompservice
+spec:
+  selector:
+    matchLabels:
+      app: pathcompservice
+  template:
+    metadata:
+      labels:
+        app: pathcompservice
+    spec:
+      terminationGracePeriodSeconds: 5
+      containers:
+      - name: server
+        image: registry.gitlab.com/teraflow-h2020/controller/pathcomp:latest
+        imagePullPolicy: Always
+        ports:
+        - containerPort: 10020
+        env:
+        - name: LOG_LEVEL
+          value: "INFO"
+        readinessProbe:
+          exec:
+            command: ["/bin/grpc_health_probe", "-addr=:10020"]
+        livenessProbe:
+          exec:
+            command: ["/bin/grpc_health_probe", "-addr=:10020"]
+        resources:
+          requests:
+            cpu: 250m
+            memory: 512Mi
+          limits:
+            cpu: 700m
+            memory: 1024Mi
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: pathcompservice
+spec:
+  type: ClusterIP
+  selector:
+    app: pathcompservice
+  ports:
+  - name: grpc
+    protocol: TCP
+    port: 10020
+    targetPort: 10020
diff --git a/proto/.gitignore b/proto/.gitignore
index 79d17a55d24e501e34b462c9005e8e5429fc43ba..d1dea37b3a85abaa18b5bd65d3ec0e1d3c6fe9b6 100644
--- a/proto/.gitignore
+++ b/proto/.gitignore
@@ -1,2 +1,7 @@
-src/
+src/*/*
+
+# used to prevent breaking symbolic links from source code folders
+!src/*/.gitignore
+!src/python/__init__.py
+
 uml/generated
diff --git a/proto/acl.proto b/proto/acl.proto
new file mode 100644
index 0000000000000000000000000000000000000000..d3717e9c4cdcf978324d08757b260ab1e9be028a
--- /dev/null
+++ b/proto/acl.proto
@@ -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.
+
+syntax = "proto3";
+package acl;
+
+enum AclRuleTypeEnum {
+  ACLRULETYPE_UNDEFINED = 0;
+  ACLRULETYPE_IPV4      = 1;
+  ACLRULETYPE_IPV6      = 2;
+  ACLRULETYPE_L2        = 3;
+  ACLRULETYPE_MPLS      = 4;
+  ACLRULETYPE_MIXED     = 5;
+}
+
+enum AclForwardActionEnum {
+  ACLFORWARDINGACTION_UNDEFINED = 0;
+  ACLFORWARDINGACTION_DROP      = 1;
+  ACLFORWARDINGACTION_ACCEPT    = 2;
+  ACLFORWARDINGACTION_REJECT    = 3;
+}
+
+enum AclLogActionEnum {
+  ACLLOGACTION_UNDEFINED = 0;
+  ACLLOGACTION_NOLOG     = 1;
+  ACLLOGACTION_SYSLOG    = 2;
+}
+
+message AclMatch {
+  uint32 dscp             = 1;
+  uint32 protocol         = 2;
+  string src_address      = 3;
+  string dst_address      = 4;
+  uint32 src_port         = 5;
+  uint32 dst_port         = 6;
+  uint32 start_mpls_label = 7;
+  uint32 end_mpls_label   = 8;
+}
+
+message AclAction {
+  AclForwardActionEnum forward_action = 1;
+  AclLogActionEnum     log_action     = 2;
+}
+
+message AclEntry {
+  uint32    sequence_id = 1;
+  string    description = 2;
+  AclMatch  match       = 3;
+  AclAction action      = 4;
+}
+
+message AclRuleSet {
+  string             name        = 1;
+  AclRuleTypeEnum    type        = 2;
+  string             description = 3;
+  string             user_id     = 4;
+  repeated AclEntry  entries     = 5;
+}
diff --git a/proto/context-policy.proto b/proto/context-policy.proto
new file mode 100644
index 0000000000000000000000000000000000000000..9fe25dec5205b66f6d622df2f9435c1321f7e45e
--- /dev/null
+++ b/proto/context-policy.proto
@@ -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.
+
+syntax = "proto3";
+package context_policy;
+
+import "context.proto";
+import "policy.proto";
+
+// created as a separate service to prevent import-loops in context and policy
+service ContextPolicyService {
+  rpc ListPolicyRuleIds(context.Empty         ) returns (policy.PolicyRuleIdList) {}
+  rpc ListPolicyRules  (context.Empty         ) returns (policy.PolicyRuleList  ) {}
+  rpc GetPolicyRule    (policy.PolicyRuleId   ) returns (policy.PolicyRuleBasic ) {}
+  rpc SetPolicyRule    (policy.PolicyRuleBasic) returns (policy.PolicyRuleId    ) {}
+  rpc RemovePolicyRule (policy.PolicyRuleId   ) returns (context.Empty          ) {}
+}
diff --git a/proto/context.proto b/proto/context.proto
index bc0bfa0c6d41c6eb3474f69c05f87cc456269c66..944cc0ef59d76de7bffb9c181a0ee61af61e73e3 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -15,6 +15,7 @@
 syntax = "proto3";
 package context;
 
+import "acl.proto";
 import "kpi_sample_types.proto";
 
 service ContextService {
@@ -82,8 +83,12 @@ enum EventTypeEnum {
   EVENTTYPE_REMOVE = 3;
 }
 
-message Event {
+message Timestamp {
   double timestamp = 1;
+}
+
+message Event {
+  Timestamp timestamp = 1;
   EventTypeEnum event_type = 2;
 }
 
@@ -223,6 +228,7 @@ message Service {
   repeated Constraint service_constraints = 4;
   ServiceStatus service_status = 5;
   ServiceConfig service_config = 6;
+  Timestamp timestamp = 7;
 }
 
 enum ServiceTypeEnum {
@@ -237,6 +243,7 @@ enum ServiceStatusEnum {
   SERVICESTATUS_PLANNED = 1;
   SERVICESTATUS_ACTIVE =  2;
   SERVICESTATUS_PENDING_REMOVAL = 3;
+  SERVICESTATUS_SLA_VIOLATED = 4;
 }
 
 message ServiceStatus {
@@ -273,6 +280,13 @@ message Slice {
   repeated ServiceId slice_service_ids = 4;
   repeated SliceId slice_subslice_ids = 5;
   SliceStatus slice_status = 6;
+  SliceOwner slice_owner = 7;
+  Timestamp timestamp = 8;
+}
+
+message SliceOwner {
+  Uuid owner_uuid = 1;
+  string owner_string = 2;
 }
 
 enum SliceStatusEnum {
@@ -281,6 +295,7 @@ enum SliceStatusEnum {
   SLICESTATUS_INIT      = 2;
   SLICESTATUS_ACTIVE    = 3;
   SLICESTATUS_DEINIT    = 4;
+  SLICESTATUS_SLA_VIOLATED = 5;
 }
 
 message SliceStatus {
@@ -305,11 +320,47 @@ message ConnectionId {
   Uuid connection_uuid = 1;
 }
 
+message ConnectionSettings_L0 {
+  string lsp_symbolic_name = 1;
+}
+
+message ConnectionSettings_L2 {
+  string src_mac_address = 1;
+  string dst_mac_address = 2;
+  uint32 ether_type = 3;
+  uint32 vlan_id = 4;
+  uint32 mpls_label = 5;
+  uint32 mpls_traffic_class = 6;
+}
+
+message ConnectionSettings_L3 {
+  string src_ip_address = 1;
+  string dst_ip_address = 2;
+  uint32 dscp = 3;
+  uint32 protocol = 4;
+  uint32 ttl = 5;
+}
+
+message ConnectionSettings_L4 {
+  uint32 src_port = 1;
+  uint32 dst_port = 2;
+  uint32 tcp_flags = 3;
+  uint32 ttl = 4;
+}
+
+message ConnectionSettings {
+  ConnectionSettings_L0 l0 = 1;
+  ConnectionSettings_L2 l2 = 2;
+  ConnectionSettings_L3 l3 = 3;
+  ConnectionSettings_L4 l4 = 4;
+}
+
 message Connection {
   ConnectionId connection_id = 1;
   ServiceId service_id = 2;
   repeated EndPointId path_hops_endpoint_ids = 3;
   repeated ServiceId sub_service_ids = 4;
+  ConnectionSettings settings = 5;
 }
 
 message ConnectionIdList {
@@ -337,6 +388,7 @@ message EndPoint {
   EndPointId endpoint_id = 1;
   string endpoint_type = 2;
   repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
+  Location endpoint_location = 4;
 }
 
 
@@ -347,19 +399,94 @@ enum ConfigActionEnum {
   CONFIGACTION_DELETE = 2;
 }
 
+message ConfigRule_Custom {
+  string resource_key = 1;
+  string resource_value = 2;
+}
+
+message ConfigRule_ACL {
+  EndPointId endpoint_id = 1;
+  acl.AclRuleSet rule_set = 2;
+}
+
 message ConfigRule {
   ConfigActionEnum action = 1;
-  string resource_key = 2;
-  string resource_value = 3;
+  oneof config_rule {
+    ConfigRule_Custom custom = 2;
+    ConfigRule_ACL acl = 3;
+  }
 }
 
 
 // ----- Constraint ----------------------------------------------------------------------------------------------------
-message Constraint {
+message Constraint_Custom {
   string constraint_type = 1;
   string constraint_value = 2;
 }
 
+message Constraint_Schedule {
+  float start_timestamp = 1;
+  float duration_days = 2;
+}
+
+message GPS_Position {
+  float latitude = 1;
+  float longitude = 2;
+}
+
+message Location {
+  oneof location {
+    string region = 1;
+    GPS_Position gps_position = 2;
+  }
+}
+
+message Constraint_EndPointLocation {
+  EndPointId endpoint_id = 1;
+  Location location = 2;
+}
+
+message Constraint_SLA_Latency {
+  float e2e_latency_ms = 1;
+}
+
+message Constraint_SLA_Capacity {
+  float capacity_gbps = 1;
+}
+
+message Constraint_SLA_Availability {
+  uint32 num_disjoint_paths = 1;
+  bool all_active = 2;
+}
+
+enum IsolationLevelEnum {
+  NO_ISOLATION = 0;
+  PHYSICAL_ISOLATION = 1;
+  LOGICAL_ISOLATION = 2;
+  PROCESS_ISOLATION = 3;
+  PHYSICAL_MEMORY_ISOLATION = 4;
+  PHYSICAL_NETWORK_ISOLATION = 5;
+  VIRTUAL_RESOURCE_ISOLATION = 6;
+  NETWORK_FUNCTIONS_ISOLATION = 7;
+  SERVICE_ISOLATION = 8;
+}
+
+message Constraint_SLA_Isolation_level {
+  IsolationLevelEnum isolation_level = 1;
+}
+
+message Constraint {
+  oneof constraint {
+    Constraint_Custom custom = 1;
+    Constraint_Schedule schedule = 2;
+    Constraint_EndPointLocation endpoint_location = 3;
+    Constraint_SLA_Capacity sla_capacity = 4;
+    Constraint_SLA_Latency sla_latency = 5;
+    Constraint_SLA_Availability sla_availability = 6;
+    Constraint_SLA_Isolation_level sla_isolation = 7;
+  }
+}
+
 
 // ----- Miscellaneous -------------------------------------------------------------------------------------------------
 message TeraFlowController {
diff --git a/proto/dlt_connector.proto b/proto/dlt_connector.proto
new file mode 100644
index 0000000000000000000000000000000000000000..c8cbeb663fafb3c133092e9c49c2ece3f59d75ae
--- /dev/null
+++ b/proto/dlt_connector.proto
@@ -0,0 +1,31 @@
+// 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.
+
+syntax = "proto3";
+package dlt;
+
+import "context.proto";
+
+service DltConnectorService {
+  rpc RecordAll (context.Empty    ) returns (context.Empty) {}
+  
+  rpc RecordAllDevices (context.Empty    ) returns (context.Empty) {}
+  rpc RecordDevice     (context.DeviceId ) returns (context.Empty) {}
+
+  rpc RecordAllServices(context.Empty    ) returns (context.Empty) {}
+  rpc RecordService    (context.ServiceId) returns (context.Empty) {}
+
+  rpc RecordAllSlices  (context.Empty    ) returns (context.Empty) {}
+  rpc RecordSlice      (context.SliceId  ) returns (context.Empty) {}
+}
diff --git a/proto/dlt.proto b/proto/dlt_gateway.proto
similarity index 99%
rename from proto/dlt.proto
rename to proto/dlt_gateway.proto
index 44fb9478fc49d612edfb7c801d79056c28104344..b2c1297ccdd4c765862f4643b554d5373d8eccd3 100644
--- a/proto/dlt.proto
+++ b/proto/dlt_gateway.proto
@@ -17,7 +17,7 @@ package dlt;
 
 import "context.proto";
 
-service DltService {
+service DltGatewayService {
   rpc RecordToDlt   (DltRecord                 ) returns (       DltRecordStatus  ) {}
   rpc GetFromDlt    (DltRecordId               ) returns (       DltRecord        ) {}
   rpc SubscribeToDlt(DltRecordSubscription     ) returns (stream DltRecordEvent   ) {}
diff --git a/proto/forecaster.proto b/proto/forecaster.proto
new file mode 100644
index 0000000000000000000000000000000000000000..576afb101ea4c8d733f3adf37fdf061e44b390eb
--- /dev/null
+++ b/proto/forecaster.proto
@@ -0,0 +1,45 @@
+// 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.
+
+syntax = "proto3";
+package forecaster;
+
+import "context.proto";
+
+service ForecasterService {
+  rpc GetForecastOfTopology (context.TopologyId) returns (Forecast) {}
+  rpc GetForecastOfLink(context.LinkId) returns (Forecast) {}
+  rpc CheckService (context.ServiceId) returns (ForecastPrediction) {}
+}
+
+message SingleForecast {
+  context.Timestamp timestamp= 1;
+  double value = 2;    
+}
+
+message Forecast {
+    oneof uuid {
+      context.TopologyId topologyId= 1;
+      context.LinkId linkId = 2;
+    }
+    repeated SingleForecast forecast = 3;
+}
+
+enum AvailabilityPredictionEnum {
+    FORECASTED_AVAILABILITY = 0;
+    FORECASTED_UNAVAILABILITY = 1;
+}
+message ForecastPrediction {
+    AvailabilityPredictionEnum prediction = 1;
+}
diff --git a/proto/generate_code_python.sh b/proto/generate_code_python.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b0df357eb079fb2721cffca43465588f7013e341
--- /dev/null
+++ b/proto/generate_code_python.sh
@@ -0,0 +1,42 @@
+#!/bin/bash -eu
+# 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 folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+mkdir -p src/python
+rm -rf src/python/*.py
+
+tee src/python/__init__.py << EOF > /dev/null
+# 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.
+EOF
+
+# Generate Python code
+python3 -m grpc_tools.protoc -I=./ --python_out=src/python/ --grpc_python_out=src/python/ *.proto
+
+# Arrange generated code imports to enable imports from arbitrary subpackages
+find src/python -type f -iname *.py -exec sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' {} \;
diff --git a/proto/compile.sh b/proto/generate_uml.sh
similarity index 89%
rename from proto/compile.sh
rename to proto/generate_uml.sh
index 520ead69a95cdfd1a076aee221d672f81810b5f0..6f20b6f4cf695274fe5d6ed27e57671196c44b70 100755
--- a/proto/compile.sh
+++ b/proto/generate_uml.sh
@@ -13,12 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-python3 -m grpc_tools.protoc -I=./ --python_out=../src/ --grpc_python_out=../src/ *.proto
 #requires installation of protoc-gen-uml
 export PATH=${HOME}/protoc-gen-uml/target/universal/stage/bin:$PATH
 protoc --uml_out=uml/ -I ./ *.proto
 cd uml
 java -jar plantuml.7997.jar *.puml
 rm *.puml
-
-
diff --git a/proto/interdomain.proto b/proto/interdomain.proto
index 735d4c1cd3ec92de41a0a0a1bc91de6acc846cd9..b8a31c2498a216e183aecbb975821d5c0ec25885 100644
--- a/proto/interdomain.proto
+++ b/proto/interdomain.proto
@@ -18,9 +18,11 @@ package interdomain;
 import "context.proto";
 
 service InterdomainService {
-  rpc Authenticate              (context.TeraFlowController) returns (context.AuthenticationResult) {}
+  rpc Authenticate              (context.TeraFlowController) returns (context.AuthenticationResult) {} // Deprecated
   rpc RequestSlice              (context.Slice             ) returns (context.SliceId             ) {}
   rpc LookUpSlice               (context.Slice             ) returns (context.SliceId             ) {}
   rpc OrderSliceFromCatalog     (context.Slice             ) returns (context.Slice               ) {}
   rpc CreateSliceAndAddToCatalog(context.Slice             ) returns (context.Slice               ) {}
+  rpc OrderSliceWithSLA         (context.Slice) returns (context.SliceId) {} // If slice with SLA already exists, returns slice. If not, it creates it.
+  rpc UpdateSlice               (context.Slice             ) returns (context.Slice               ) {}
 }
diff --git a/proto/monitoring.proto b/proto/monitoring.proto
index 293eb982a758e9869d8310134bd65bca6c8dfd32..2c7b98d2ca3392906e0f42896907bb887b45e80b 100644
--- a/proto/monitoring.proto
+++ b/proto/monitoring.proto
@@ -19,27 +19,73 @@ import "context.proto";
 import "kpi_sample_types.proto";
 
 service MonitoringService {
-  rpc CreateKpi       (KpiDescriptor    ) returns (KpiId        ) {}
-  rpc GetKpiDescriptor(KpiId            ) returns (KpiDescriptor) {}
-  rpc IncludeKpi      (Kpi              ) returns (context.Empty) {}
-  rpc MonitorKpi      (MonitorKpiRequest) returns (context.Empty) {}
-  rpc GetStreamKpi    (KpiId            ) returns (stream Kpi   ) {}
-  rpc GetInstantKpi   (KpiId            ) returns (Kpi          ) {}
+  rpc CreateKpi                (KpiDescriptor        )     returns (KpiId            ) {}
+  rpc EditKpiDescriptor        (EditedKpiDescriptor  )     returns (context.Empty    ) {}
+  rpc DeleteKpi                (KpiId                )     returns (context.Empty    ) {}
+  rpc GetKpiDescriptorList     (context.Empty        )     returns (KpiDescriptorList) {}
+  rpc CreateBundleKpi          (BundleKpiDescriptor  )     returns (KpiId            ) {}
+  rpc GetKpiDescriptor         (KpiId                )     returns (KpiDescriptor    ) {}
+  rpc IncludeKpi               (Kpi                  )     returns (context.Empty    ) {}
+  rpc MonitorKpi               (MonitorKpiRequest    )     returns (context.Empty    ) {}
+  rpc QueryKpiData             (KpiQuery             )     returns (KpiList          ) {}
+  rpc SubscribeKpi             (SubsDescriptor       )     returns (stream KpiList   ) {}
+  rpc GetSubsDescriptor        (SubscriptionID       )     returns (SubsDescriptor   ) {}
+  rpc GetSubscriptions         (context.Empty        )     returns (SubsIDList       ) {}
+  rpc EditKpiSubscription      (SubsDescriptor       )     returns (context.Empty    ) {}
+  rpc CreateKpiAlarm           (AlarmDescriptor      )     returns ( AlarmID ) {}
+  rpc EditKpiAlarm             (AlarmDescriptor      )     returns (context.Empty    ) {}
+  rpc GetAlarms                (context.Empty        )     returns (AlarmIDList      ) {}
+  rpc GetAlarmDescriptor       (AlarmID              )     returns (AlarmDescriptor  ) {}
+  rpc GetAlarmResponseStream   (AlarmID              )     returns (stream AlarmResponse ) {}
+  //  rpc GetStreamKpi            (KpiId                )     returns (stream Kpi       ) {}
+  //  rpc GetInstantKpi           (KpiId                )     returns (KpiList          ) {}
 }
 
 message KpiDescriptor {
-  string kpi_description = 1;
-  kpi_sample_types.KpiSampleType kpi_sample_type = 2;
-  context.DeviceId device_id = 3;
-  context.EndPointId endpoint_id = 4;
-  context.ServiceId  service_id  = 5;
-//  context.SliceId    slice_id    = 6;
+  string kpi_description                          = 1;
+  kpi_sample_types.KpiSampleType kpi_sample_type  = 2;
+  context.DeviceId device_id                      = 3;
+  context.EndPointId endpoint_id                  = 4;
+  context.ServiceId  service_id                   = 5;
+  context.SliceId    slice_id                     = 6;
 }
 
-message MonitorKpiRequest{
-  KpiId kpi_id = 1;
-  float sampling_duration_s = 2;
-  float sampling_interval_s = 3;
+message BundleKpiDescriptor {
+  string kpi_description                          = 1;
+  repeated KpiId kpi_id_list                      = 2;
+  kpi_sample_types.KpiSampleType kpi_sample_type  = 3;
+  context.DeviceId device_id                      = 4;
+  context.EndPointId endpoint_id                  = 5;
+  context.ServiceId  service_id                   = 6;
+  context.SliceId    slice_id                     = 7;
+}
+
+message EditedKpiDescriptor {
+  KpiId kpi_id                                    = 1;
+  string kpi_description                          = 2;
+  repeated KpiId kpi_id_list                      = 3;
+  kpi_sample_types.KpiSampleType kpi_sample_type  = 4;
+  context.DeviceId device_id                      = 5;
+  context.EndPointId endpoint_id                  = 6;
+  context.ServiceId  service_id                   = 7;
+  context.SliceId    slice_id                     = 8;
+}
+
+message MonitorKpiRequest {
+  KpiId kpi_id              = 1;
+  float monitoring_window_s = 2;
+  float sampling_rate_s     = 3;
+  // Pending add field to reflect Available Device Protocols
+}
+
+message KpiQuery {
+  repeated KpiId kpi_id     = 1;
+  float monitoring_window_s = 2;
+  float sampling_rate_s     = 3;
+  uint32 last_n_samples     = 4;  // used when you want something like "get the last N many samples
+  string start_date         = 5;  // used when you want something like "get the samples since X date/time"
+  string end_date           = 6;  // used when you want something like "get the samples until X date/time"
+  // Pending add field to reflect Available Device Protocols
 }
 
 message KpiId {
@@ -47,20 +93,73 @@ message KpiId {
 }
 
 message Kpi {
-  KpiId kpi_id = 1;
-  string timestamp = 2;
-  KpiValue kpi_value = 4;
+  KpiId kpi_id        = 1;
+  string timestamp    = 2;
+  KpiValue kpi_value  = 3;
+}
+
+message KpiValueRange {
+  KpiValue kpiMinValue = 1;
+  KpiValue kpiMaxValue = 2;
 }
 
 message KpiValue {
   oneof value {
-    uint32 intVal = 1;
-    float floatVal = 2;
-    string stringVal = 3;
-    bool boolVal = 4;
+    uint32 intVal     = 1;
+    float floatVal    = 2;
+    string stringVal  = 3;
+    bool boolVal      = 4;
   }
 }
 
 message KpiList {
-  repeated Kpi kpi_list = 1;
+    repeated Kpi kpi_list = 1;
+}
+
+message KpiDescriptorList {
+    repeated KpiDescriptor kpi_descriptor_list = 1;
+}
+
+message SubsDescriptor{
+  KpiId kpi_id              = 1;
+  float sampling_duration_s = 2;
+  float sampling_interval_s = 3;
+  string start_date         = 4;  // used when you want something like "get the samples since X date/time"
+  string end_date           = 5;  // used when you want something like "get the samples until X date/time"
+  // Pending add field to reflect Available Device Protocols
+}
+
+message SubscriptionID {
+  context.Uuid subs_id = 1;
+}
+
+message SubsResponse {
+  SubscriptionID subs_id    = 1;
+  repeated KpiList kpi_list = 2;
+}
+
+message SubsIDList {
+    repeated SubscriptionID subs_list = 1;
+}
+
+message AlarmDescriptor {
+  string alarm_description      = 1;
+  string name                   = 2;
+  KpiId kpi_id                  = 3;
+  KpiValueRange kpi_value_range = 4;
+  string timestamp              = 5;
+}
+
+message AlarmID{
+  context.Uuid alarm_id = 1;
+}
+
+message AlarmResponse {
+  AlarmID alarm_id    = 1;
+  string text         = 2;
+  KpiValue kpi_value  = 3;
+}
+
+message AlarmIDList {
+    repeated AlarmID alarm_list = 1;
 }
diff --git a/proto/pathcomp.proto b/proto/pathcomp.proto
new file mode 100644
index 0000000000000000000000000000000000000000..9eb650fb9981b4b84f31b63796eec0c7a8e780b6
--- /dev/null
+++ b/proto/pathcomp.proto
@@ -0,0 +1,48 @@
+// 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.
+
+syntax = "proto3";
+package pathcomp;
+
+import "context.proto";
+
+service PathCompService {
+  rpc Compute(PathCompRequest) returns (PathCompReply) {}
+}
+
+message Algorithm_ShortestPath {}
+
+message Algorithm_KShortestPath {
+  uint32 k_inspection = 1;
+  uint32 k_return     = 2;
+}
+
+message PathCompRequest {
+  repeated context.Service services = 1;
+  oneof algorithm {
+    Algorithm_ShortestPath  shortest_path   = 10;
+    Algorithm_KShortestPath k_shortest_path = 11;
+  }
+}
+
+message PathCompReply {
+  // Services requested completed with possible missing fields, and
+  // sub-services required for supporting requested services on the
+  // underlying layers.
+  repeated context.Service services = 1;
+
+  // Connections supporting the requested services and sub-services
+  // required for the underlying layers.
+  repeated context.Connection connections = 2;
+}
diff --git a/proto/policy.proto b/proto/policy.proto
index 0887ae955edb544616d711189db0133fa788c104..9e686f180994be988543ebd9a26dfd31dffed007 100644
--- a/proto/policy.proto
+++ b/proto/policy.proto
@@ -20,23 +20,28 @@ import "policy-condition.proto";
 import "policy-action.proto";
 
 service PolicyService {
-  rpc PolicyAdd (PolicyRule) returns (PolicyRuleState) {}
-  rpc PolicyUpdate (PolicyRule) returns (PolicyRuleState) {}
-  rpc PolicyDelete (PolicyRule) returns (PolicyRuleState) {}
-  rpc GetPolicy (PolicyRuleId) returns (PolicyRule) {}
-  rpc GetPolicyByDeviceId (context.DeviceId) returns (PolicyRuleList) {}
-  rpc GetPolicyByServiceId (context.ServiceId) returns (PolicyRuleList) {}
+  rpc PolicyAddService (PolicyRuleService) returns (PolicyRuleState) {}
+  rpc PolicyAddDevice (PolicyRuleDevice) returns (PolicyRuleState) {}
+  rpc PolicyUpdateService (PolicyRuleService) returns (PolicyRuleState) {}
+  rpc PolicyUpdateDevice (PolicyRuleDevice) returns (PolicyRuleState) {}
+  rpc PolicyDelete (PolicyRuleId) returns (PolicyRuleState) {}
+  rpc GetPolicyService (PolicyRuleId) returns (PolicyRuleService) {}
+  rpc GetPolicyDevice (PolicyRuleId) returns (PolicyRuleDevice) {}
+  rpc GetPolicyByServiceId (context.ServiceId) returns (PolicyRuleServiceList) {}
 }
 
 enum RuleState {
-  POLICY_INACTIVE = 0;    // Rule is currently inactive
-  POLICY_PLANNED = 1;     // Rule installation planned
-  POLICY_ACTIVE = 2;      // Rule is currently active
-}
-
-enum PolicyRuleType {
-  POLICYTYPE_DEVICE = 0;  // Device-level
-  POLICYTYPE_NETWORK = 1; // Network-wide
+  POLICY_UNDEFINED = 0;     // Undefined rule state
+  POLICY_FAILED = 1;        // Rule failed
+  POLICY_INSERTED = 2;      // Rule is just inserted
+  POLICY_VALIDATED = 3;     // Rule content is correct
+  POLICY_PROVISIONED = 4;   // Rule subscribed to Monitoring
+  POLICY_ACTIVE = 5;        // Rule is currently active (alarm is just thrown by Monitoring)
+  POLICY_ENFORCED = 6;      // Rule action is successfully enforced
+  POLICY_INEFFECTIVE = 7;   // The applied rule action did not work as expected
+  POLICY_EFFECTIVE = 8;     // The applied rule action did work as expected
+  POLICY_UPDATED = 9;       // Operator requires a policy to change
+  POLICY_REMOVED = 10;      // Operator requires to remove a policy
 }
 
 message PolicyRuleId {
@@ -44,39 +49,56 @@ message PolicyRuleId {
 }
 
 message PolicyRuleState {
-  context.Uuid policyRuleId = 1;
-  RuleState policyRuleState = 2;
+  RuleState policyRuleState = 1;
 }
 
-// IETF draft: Framework for Use of ECA (Event Condition Action) in Network Self Management
-//     Source: https://datatracker.ietf.org/doc/draft-bwd-netmod-eca-framework/
-// Event
-message PolicyRuleEvent {
-  context.Event event = 1;
+// Basic policy rule attributes
+message PolicyRuleBasic {
+  PolicyRuleId policyRuleId = 1;
+  optional PolicyRuleState policyRuleState = 2;
+  uint32 priority = 3;
+
+  // Event-Condition-Action (ECA) model
+  repeated PolicyRuleCondition conditionList = 4;  // When these policy conditions are met, an event is automatically thrown
+  BooleanOperator booleanOperator = 5;             // Evaluation operator to be used
+  repeated PolicyRuleAction actionList = 6;        // One or more actions should be applied
 }
 
-// Policy rule partially complies with IETF’s:
-//     RFC 3060: https://datatracker.ietf.org/doc/html/rfc3060
-//     RFC 3460: https://datatracker.ietf.org/doc/html/rfc3460
-// Enhanced with a policy rule event according to the ECA model
-message PolicyRule {
+// Service-oriented policy rule
+message PolicyRuleService {
   // Basic policy rule attributes
-  PolicyRuleId policyRuleId = 1;
-  PolicyRuleType policyRuleType = 2;
-  uint32 priority = 3;
+  PolicyRuleBasic policyRuleBasic = 1;
+
+  // Affected service and (some of) its device(s)
+  context.ServiceId serviceId = 2;
+  repeated context.DeviceId deviceList = 3;  // List of devices this service is traversing (not exhaustive)
+}
+
+// Device-oriented policy rule
+message PolicyRuleDevice {
+  // Basic policy rule attributes
+  PolicyRuleBasic policyRuleBasic = 1;
+
+  // Affected device(s)
+  repeated context.DeviceId deviceList = 2;
+}
+
+// A list of policy rule IDs
+message PolicyRuleIdList {
+  repeated PolicyRuleId policyRuleIdList = 1;
+}
 
-  // Event-Condition-Action model
-  PolicyRuleEvent event = 4;                         // A single event triggers the policy
-  repeated PolicyRuleCondition conditionList = 5;    // One or more conditions must be met
-  BooleanOperator booleanOperator = 6;               // Evaluation operator to be used
-  repeated PolicyRuleAction actionList = 7;          // One or more actions should be applied
+// A list of service-oriented policy rules
+message PolicyRuleServiceList {
+  repeated PolicyRuleService policyRuleServiceList = 1;
+}
 
-  // Affected service and devices
-  context.ServiceId serviceId = 8;
-  repeated context.DeviceId deviceList = 9;
+// A list of device-oriented policy rules
+message PolicyRuleDeviceList {
+  repeated PolicyRuleDevice policyRuleDeviceList = 1;
 }
 
 // A list of policy rules
 message PolicyRuleList {
-  repeated PolicyRule policyRuleList = 1;
+  repeated PolicyRuleId policyRules = 1;
 }
diff --git a/proto/slice.proto b/proto/slice.proto
index 9c518c9da05f850f209dc8a3f8d945fff4aced2b..69fa242e2310f791faa2429d59c01fc2572025d2 100644
--- a/proto/slice.proto
+++ b/proto/slice.proto
@@ -21,4 +21,6 @@ service SliceService {
   rpc CreateSlice(context.Slice  ) returns (context.SliceId) {}
   rpc UpdateSlice(context.Slice  ) returns (context.SliceId) {}
   rpc DeleteSlice(context.SliceId) returns (context.Empty  ) {}
+  rpc OrderSliceWithSLA(context.Slice) returns (context.SliceId) {} // If slice with SLA already exists, returns slice. If not, it creates it.
+  rpc RunSliceGrouping (context.Empty) returns (context.Empty) {} // Optimizes the underlying services and re-maps them to the requested slices.
 }
diff --git a/proto/src/java/.gitignore b/proto/src/java/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3f93458aca854d3e06f27ca0caa672f3906f1720
--- /dev/null
+++ b/proto/src/java/.gitignore
@@ -0,0 +1,5 @@
+*
+
+# used to prevent breaking symbolic links from source code folders
+!.gitignore
+!__init__.py
diff --git a/proto/src/python/.gitignore b/proto/src/python/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3f93458aca854d3e06f27ca0caa672f3906f1720
--- /dev/null
+++ b/proto/src/python/.gitignore
@@ -0,0 +1,5 @@
+*
+
+# used to prevent breaking symbolic links from source code folders
+!.gitignore
+!__init__.py
diff --git a/proto/src/python/__init__.py b/proto/src/python/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9953c820575d42fa88351cc8de022d880ba96e6a
--- /dev/null
+++ b/proto/src/python/__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/proto/te.proto b/proto/te.proto
index f811f86fed64220cd98d1d8439cca5af3dd8548a..f85f94f48322d85e2c6bd7e667f7dfc9cb2febda 100644
--- a/proto/te.proto
+++ b/proto/te.proto
@@ -16,10 +16,9 @@ syntax = "proto3";
 package te;
 
 import "context.proto";
-import "service.proto";
 
 service TEService {
-  rpc RequestLSP(service.Service  ) returns (service.ServiceState) {}
-  rpc UpdateLSP (service.ServiceId) returns (service.ServiceState) {}
-  rpc DeleteLSP (service.ServiceId) returns (context.Empty       ) {}
+  rpc RequestLSP (context.Service) returns (context.ServiceStatus) {}
+  rpc UpdateLSP (context.ServiceId) returns (context.ServiceStatus) {}
+  rpc DeleteLSP (context.ServiceId) returns (context.Empty) {}
 }
diff --git a/proto/uml/acl.png b/proto/uml/acl.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cc4e0f9decb0ecac761c6ab971ecdb80890a4b4
Binary files /dev/null and b/proto/uml/acl.png differ
diff --git a/proto/uml/context.png b/proto/uml/context.png
index 57a2493cf8596d1f4e70f2e3056d1a9d71432aee..3ea3a6e21dd3eddba749c2f0b483d41b365ef11f 100644
Binary files a/proto/uml/context.png and b/proto/uml/context.png differ
diff --git a/proto/uml/dlt.png b/proto/uml/dlt.png
index 51988d55b4e63230ff62e647f1b52e5f9418ad25..f8d4e25c1881a932c49bf151eab56921a4ff8a7b 100644
Binary files a/proto/uml/dlt.png and b/proto/uml/dlt.png differ
diff --git a/proto/uml/forecaster.png b/proto/uml/forecaster.png
new file mode 100644
index 0000000000000000000000000000000000000000..d32e142959ca0060556ce6ce622552dc5ff4d416
Binary files /dev/null and b/proto/uml/forecaster.png differ
diff --git a/proto/uml/monitoring.png b/proto/uml/monitoring.png
index 676389fc6971457b3d0c4194484bb78b4be52404..98f2e1d64766faf55599e465dd30f57e3518b11f 100644
Binary files a/proto/uml/monitoring.png and b/proto/uml/monitoring.png differ
diff --git a/proto/uml/policy.png b/proto/uml/policy.png
index e4f5c52848b75643c3a8272fb0223147bced5b90..adbebe89f657a77d40b3ddf8cec95a93951deaf0 100644
Binary files a/proto/uml/policy.png and b/proto/uml/policy.png differ
diff --git a/proto/uml/slice.png b/proto/uml/slice.png
deleted file mode 100644
index 01b62425b28f6bb5319a96ddd7fc5b62ff620620..0000000000000000000000000000000000000000
Binary files a/proto/uml/slice.png and /dev/null differ
diff --git a/scripts/report_coverage_pathcomp.sh b/scripts/report_coverage_pathcomp.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3af2790f838619e495a9b5727506f6829ad12a35
--- /dev/null
+++ b/scripts/report_coverage_pathcomp.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.
+
+
+./report_coverage_all.sh | grep --color -E -i "^pathcomp/.*$|$"
diff --git a/scripts/run_tests_locally-device.sh b/scripts/run_tests_locally-device.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ba6c0b6a58031720addc17cc0de9169e592099f5
--- /dev/null
+++ b/scripts/run_tests_locally-device.sh
@@ -0,0 +1,28 @@
+#!/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.
+
+
+PROJECTDIR=`pwd`
+
+cd $PROJECTDIR/src
+RCFILE=$PROJECTDIR/coverage/.coveragerc
+
+# Run unitary tests and analyze coverage of code at same time
+
+# Useful flags for pytest:
+#-o log_cli=true -o log_file=device.log -o log_file_level=DEBUG
+
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    device/tests/test_unitary.py
diff --git a/scripts/run_tests_locally-pathcomp.sh b/scripts/run_tests_locally-pathcomp.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f56f47a8b592939243a2ec5d9fd95d89046582d1
--- /dev/null
+++ b/scripts/run_tests_locally-pathcomp.sh
@@ -0,0 +1,28 @@
+#!/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.
+
+
+PROJECTDIR=`pwd`
+
+cd $PROJECTDIR/src
+RCFILE=$PROJECTDIR/coverage/.coveragerc
+
+# Run unitary tests and analyze coverage of code at same time
+
+# Useful flags for pytest:
+#-o log_cli=true -o log_file=service.log -o log_file_level=DEBUG
+
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    pathcomp/tests/test_unitary.py
diff --git a/scripts/run_tests_locally.sh b/scripts/run_tests_locally.sh
index 4a95fd8be7ac83ff0b5ec5a3db47c0cf4fae06f4..69463ea79bf717565385a44f168e84780902fce8 100755
--- a/scripts/run_tests_locally.sh
+++ b/scripts/run_tests_locally.sh
@@ -97,3 +97,6 @@ coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
 
 coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
     slice/tests/test_unitary.py
+
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    pathcomp/tests/test_unitary.py
diff --git a/src/automation/src/main/docker/Dockerfile.multistage.jvm b/src/automation/src/main/docker/Dockerfile.multistage.jvm
index 111527d46d08891480894240f381e7bd6501f051..426e154baf71b1854fa688fb9302bbc539a1a635 100644
--- a/src/automation/src/main/docker/Dockerfile.multistage.jvm
+++ b/src/automation/src/main/docker/Dockerfile.multistage.jvm
@@ -60,7 +60,7 @@ COPY --from=builder --chown=1001 /app/target/quarkus-app/app/ /deployments/app/
 COPY --from=builder --chown=1001 /app/target/quarkus-app/quarkus/ /deployments/quarkus/
 
 EXPOSE 8080
-EXPOSE 9999
+EXPOSE 5050
 USER 1001
 
 ENTRYPOINT [ "/deployments/run-java.sh" ]
diff --git a/src/automation/src/main/resources/application.yml b/src/automation/src/main/resources/application.yml
index 24280803e81ecb90933a7ccd531a754b034cabb7..bc89d4348dfdfc5dc3f9159fb167d00509a8e4dc 100644
--- a/src/automation/src/main/resources/application.yml
+++ b/src/automation/src/main/resources/application.yml
@@ -19,7 +19,7 @@ quarkus:
     path: teraflow-automation-banner.txt
   grpc:
     server:
-      port: 9999
+      port: 5050
       enable-reflection-service: true
     clients:
       context:
@@ -53,9 +53,9 @@ quarkus:
       http:
         host-port: 8080
         container-port: 8080
-      grpc-server:
-        host-port: 9999
-        container-port: 9999
+      grpc:
+        host-port: 5050
+        container-port: 5050
     env:
       vars:
         context-service-host: "contextservice"
diff --git a/src/automation/target/kubernetes/kubernetes.yml b/src/automation/target/kubernetes/kubernetes.yml
index 0e4bc0c62fdeb19644d596189a295bba3e53dd97..d494e82f18a77d85b696d865270eac7923f6cc7c 100644
--- a/src/automation/target/kubernetes/kubernetes.yml
+++ b/src/automation/target/kubernetes/kubernetes.yml
@@ -3,20 +3,20 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: fee580ca578000e6006c77704c0d6240e261de0f
-    app.quarkus.io/build-timestamp: 2022-05-27 - 08:02:36 +0000
+    app.quarkus.io/commit-id: cfe69c57feb1d488c2dda620021e3c62d67fc3d3
+    app.quarkus.io/build-timestamp: 2022-07-14 - 07:57:09 +0000
   labels:
     app.kubernetes.io/name: automationservice
     app: automationservice
   name: automationservice
 spec:
   ports:
-    - name: grpc-server
-      port: 9999
-      targetPort: 9999
     - name: http
       port: 8080
       targetPort: 8080
+    - name: grpc
+      port: 5050
+      targetPort: 5050
   selector:
     app.kubernetes.io/name: automationservice
   type: ClusterIP
@@ -25,8 +25,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: fee580ca578000e6006c77704c0d6240e261de0f
-    app.quarkus.io/build-timestamp: 2022-05-27 - 08:02:36 +0000
+    app.quarkus.io/commit-id: cfe69c57feb1d488c2dda620021e3c62d67fc3d3
+    app.quarkus.io/build-timestamp: 2022-07-14 - 07:57:09 +0000
   labels:
     app: automationservice
     app.kubernetes.io/name: automationservice
@@ -39,8 +39,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: fee580ca578000e6006c77704c0d6240e261de0f
-        app.quarkus.io/build-timestamp: 2022-05-27 - 08:02:36 +0000
+        app.quarkus.io/commit-id: cfe69c57feb1d488c2dda620021e3c62d67fc3d3
+        app.quarkus.io/build-timestamp: 2022-07-14 - 07:57:09 +0000
       labels:
         app: automationservice
         app.kubernetes.io/name: automationservice
@@ -51,10 +51,10 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: CONTEXT_SERVICE_HOST
-              value: ContextService
             - name: DEVICE_SERVICE_HOST
               value: DeviceService
+            - name: CONTEXT_SERVICE_HOST
+              value: ContextService
           image: registry.gitlab.com/teraflow-h2020/controller/automation:0.2.0
           imagePullPolicy: Always
           livenessProbe:
@@ -69,12 +69,12 @@ spec:
             timeoutSeconds: 10
           name: automationservice
           ports:
-            - containerPort: 9999
-              name: grpc-server
-              protocol: TCP
             - containerPort: 8080
               name: http
               protocol: TCP
+            - containerPort: 5050
+              name: grpc
+              protocol: TCP
           readinessProbe:
             failureThreshold: 3
             httpGet:
diff --git a/src/common/Constants.py b/src/common/Constants.py
index dbe4124e792db73e122a7b436ca19be814aed761..f1ccf9758df907fdb97bb568cb1abba89e5a6539 100644
--- a/src/common/Constants.py
+++ b/src/common/Constants.py
@@ -46,6 +46,7 @@ class ServiceNameEnum(Enum):
     COMPUTE       = 'compute'
     CYBERSECURITY = 'cybersecurity'
     INTERDOMAIN   = 'interdomain'
+    PATHCOMP      = 'pathcomp'
 
 # Default gRPC service ports
 DEFAULT_SERVICE_GRPC_PORTS = {
@@ -60,6 +61,7 @@ DEFAULT_SERVICE_GRPC_PORTS = {
     ServiceNameEnum.COMPUTE      .value :  9090,
     ServiceNameEnum.CYBERSECURITY.value : 10000,
     ServiceNameEnum.INTERDOMAIN  .value : 10010,
+    ServiceNameEnum.PATHCOMP     .value : 10020,
 }
 
 # Default HTTP/REST-API service ports
diff --git a/src/common/proto b/src/common/proto
new file mode 120000
index 0000000000000000000000000000000000000000..0ae252a7824cad03d85fa60224b87d8c779f1588
--- /dev/null
+++ b/src/common/proto
@@ -0,0 +1 @@
+../../proto/src/python
\ No newline at end of file
diff --git a/src/common/tests/MockServicerImpl_Context.py b/src/common/tests/MockServicerImpl_Context.py
index 38f932f4dc9638abf3e526e6867800dd01cca154..8b4560016bc2cfa54d5ac30e7147b4df59e04e72 100644
--- a/src/common/tests/MockServicerImpl_Context.py
+++ b/src/common/tests/MockServicerImpl_Context.py
@@ -18,8 +18,8 @@ from common.tools.grpc.Tools import grpc_message_to_json_string
 from context.proto.context_pb2 import (
     Connection, ConnectionEvent, ConnectionId, ConnectionIdList, ConnectionList, Context, ContextEvent, ContextId,
     ContextIdList, ContextList, Device, DeviceEvent, DeviceId, DeviceIdList, DeviceList, Empty, Link, LinkEvent,
-    LinkId, LinkIdList, LinkList, Service, ServiceEvent, ServiceId, ServiceIdList, ServiceList, Topology,
-    TopologyEvent, TopologyId, TopologyIdList, TopologyList)
+    LinkId, LinkIdList, LinkList, Service, ServiceEvent, ServiceId, ServiceIdList, ServiceList, Slice, SliceEvent,
+    SliceId, SliceIdList, SliceList, Topology, TopologyEvent, TopologyId, TopologyIdList, TopologyList)
 from context.proto.context_pb2_grpc import ContextServiceServicer
 
 LOGGER = logging.getLogger(__name__)
@@ -92,12 +92,12 @@ class MockServicerImpl_Context(ContextServiceServicer):
 
     def ListTopologyIds(self, request: ContextId, context : grpc.ServicerContext) -> TopologyIdList:
         LOGGER.info('[ListTopologyIds] request={:s}'.format(grpc_message_to_json_string(request)))
-        topologies = get_entries(self.database, 'topology[{:s}]'.format(str(request.context_id.context_uuid.uuid)))
+        topologies = get_entries(self.database, 'topology[{:s}]'.format(str(request.context_uuid.uuid)))
         return TopologyIdList(topology_ids=[topology.topology_id for topology in topologies])
 
     def ListTopologies(self, request: ContextId, context : grpc.ServicerContext) -> TopologyList:
         LOGGER.info('[ListTopologies] request={:s}'.format(grpc_message_to_json_string(request)))
-        topologies = get_entries(self.database, 'topology[{:s}]'.format(str(request.context_id.context_uuid.uuid)))
+        topologies = get_entries(self.database, 'topology[{:s}]'.format(str(request.context_uuid.uuid)))
         return TopologyList(topologies=[topology for topology in topologies])
 
     def GetTopology(self, request: TopologyId, context : grpc.ServicerContext) -> Topology:
@@ -171,16 +171,48 @@ class MockServicerImpl_Context(ContextServiceServicer):
         LOGGER.info('[GetLinkEvents] request={:s}'.format(grpc_message_to_json_string(request)))
 
 
+    # ----- Slice ------------------------------------------------------------------------------------------------------
+
+    def ListSliceIds(self, request: ContextId, context : grpc.ServicerContext) -> SliceIdList:
+        LOGGER.info('[ListSliceIds] request={:s}'.format(grpc_message_to_json_string(request)))
+        slices = get_entries(self.database, 'slice[{:s}]'.format(str(request.context_uuid.uuid)))
+        return SliceIdList(slice_ids=[slice.slice_id for slice in slices])
+
+    def ListSlices(self, request: ContextId, context : grpc.ServicerContext) -> SliceList:
+        LOGGER.info('[ListSlices] request={:s}'.format(grpc_message_to_json_string(request)))
+        slices = get_entries(self.database, 'slice[{:s}]'.format(str(request.context_uuid.uuid)))
+        return SliceList(slices=[slice for slice in slices])
+
+    def GetSlice(self, request: SliceId, context : grpc.ServicerContext) -> Slice:
+        LOGGER.info('[GetSlice] request={:s}'.format(grpc_message_to_json_string(request)))
+        container_name = 'slice[{:s}]'.format(str(request.context_id.context_uuid.uuid))
+        return get_entry(context, self.database, container_name, request.slice_uuid.uuid)
+
+    def SetSlice(self, request: Slice, context : grpc.ServicerContext) -> SliceId:
+        LOGGER.info('[SetSlice] request={:s}'.format(grpc_message_to_json_string(request)))
+        return set_entry(
+            self.database, 'slice[{:s}]'.format(str(request.slice_id.context_id.context_uuid.uuid)),
+            request.slice_id.slice_uuid.uuid, request).slice_id
+
+    def RemoveSlice(self, request: SliceId, context : grpc.ServicerContext) -> Empty:
+        LOGGER.info('[RemoveSlice] request={:s}'.format(grpc_message_to_json_string(request)))
+        container_name = 'slice[{:s}]'.format(str(request.context_id.context_uuid.uuid))
+        return del_entry(context, self.database, container_name, request.slice_uuid.uuid)
+
+    def GetSliceEvents(self, request: Empty, context : grpc.ServicerContext) -> Iterator[SliceEvent]:
+        LOGGER.info('[GetSliceEvents] request={:s}'.format(grpc_message_to_json_string(request)))
+
+
     # ----- Service ----------------------------------------------------------------------------------------------------
 
     def ListServiceIds(self, request: ContextId, context : grpc.ServicerContext) -> ServiceIdList:
         LOGGER.info('[ListServiceIds] request={:s}'.format(grpc_message_to_json_string(request)))
-        services = get_entries(self.database, 'service[{:s}]'.format(str(request.context_id.context_uuid.uuid)))
+        services = get_entries(self.database, 'service[{:s}]'.format(str(request.context_uuid.uuid)))
         return ServiceIdList(service_ids=[service.service_id for service in services])
 
     def ListServices(self, request: ContextId, context : grpc.ServicerContext) -> ServiceList:
         LOGGER.info('[ListServices] request={:s}'.format(grpc_message_to_json_string(request)))
-        services = get_entries(self.database, 'service[{:s}]'.format(str(request.context_id.context_uuid.uuid)))
+        services = get_entries(self.database, 'service[{:s}]'.format(str(request.context_uuid.uuid)))
         return ServiceList(services=[service for service in services])
 
     def GetService(self, request: ServiceId, context : grpc.ServicerContext) -> Service:
diff --git a/src/common/tools/object_factory/Service.py b/src/common/tools/object_factory/Service.py
index a84953926bed1a479d9c832025e580286353630b..21264d680cc8f184512097db8c7082134f16e28f 100644
--- a/src/common/tools/object_factory/Service.py
+++ b/src/common/tools/object_factory/Service.py
@@ -18,6 +18,11 @@ from common.Constants import DEFAULT_CONTEXT_UUID
 from common.tools.object_factory.Context import json_context_id
 from context.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum
 
+def get_service_uuid(a_endpoint_id : Dict, z_endpoint_id : Dict) -> str:
+    return 'svc:{:s}/{:s}=={:s}/{:s}'.format(
+        a_endpoint_id['device_id']['device_uuid']['uuid'], a_endpoint_id['endpoint_uuid']['uuid'],
+        a_endpoint_id['device_id']['device_uuid']['uuid'], z_endpoint_id['endpoint_uuid']['uuid'])
+
 def json_service_id(service_uuid : str, context_id : Optional[Dict] = None):
     result = {'service_uuid': {'uuid': service_uuid}}
     if context_id is not None: result['context_id'] = copy.deepcopy(context_id)
diff --git a/src/context/genproto.sh b/src/context/genproto.sh
index 5c54cd7a2b8f090d520c2f500cfc966838f657ab..00853475fd76757f21236550e88ecc0da160241a 100755
--- a/src/context/genproto.sh
+++ b/src/context/genproto.sh
@@ -36,10 +36,20 @@ tee proto/__init__.py << EOF > /dev/null
 
 EOF
 
+python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto acl.proto
 python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto context.proto
+python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto context-policy.proto
 python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto kpi_sample_types.proto
+python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto policy.proto
 
+rm proto/acl_pb2_grpc.py
 rm proto/kpi_sample_types_pb2_grpc.py
+rm proto/policy_pb2_grpc.py
 
-sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/context_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/acl_pb2.py
 sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/context_pb2_grpc.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/context_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/context_policy_pb2_grpc.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/context_policy_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/kpi_sample_types_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/policy_pb2.py
diff --git a/src/context/proto/acl_pb2.py b/src/context/proto/acl_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..4e44dbb0e6f033842a194f6a471941232100dd67
--- /dev/null
+++ b/src/context/proto/acl_pb2.py
@@ -0,0 +1,431 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: acl.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='acl.proto',
+  package='acl',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\tacl.proto\x12\x03\x61\x63l\"\xaa\x01\n\x08\x41\x63lMatch\x12\x0c\n\x04\x64scp\x18\x01 \x01(\r\x12\x10\n\x08protocol\x18\x02 \x01(\r\x12\x13\n\x0bsrc_address\x18\x03 \x01(\t\x12\x13\n\x0b\x64st_address\x18\x04 \x01(\t\x12\x10\n\x08src_port\x18\x05 \x01(\r\x12\x10\n\x08\x64st_port\x18\x06 \x01(\r\x12\x18\n\x10start_mpls_label\x18\x07 \x01(\r\x12\x16\n\x0e\x65nd_mpls_label\x18\x08 \x01(\r\"i\n\tAclAction\x12\x31\n\x0e\x66orward_action\x18\x01 \x01(\x0e\x32\x19.acl.AclForwardActionEnum\x12)\n\nlog_action\x18\x02 \x01(\x0e\x32\x15.acl.AclLogActionEnum\"r\n\x08\x41\x63lEntry\x12\x13\n\x0bsequence_id\x18\x01 \x01(\r\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1c\n\x05match\x18\x03 \x01(\x0b\x32\r.acl.AclMatch\x12\x1e\n\x06\x61\x63tion\x18\x04 \x01(\x0b\x32\x0e.acl.AclAction\"\x84\x01\n\nAclRuleSet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\"\n\x04type\x18\x02 \x01(\x0e\x32\x14.acl.AclRuleTypeEnum\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0f\n\x07user_id\x18\x04 \x01(\t\x12\x1e\n\x07\x65ntries\x18\x05 \x03(\x0b\x32\r.acl.AclEntry*\x99\x01\n\x0f\x41\x63lRuleTypeEnum\x12\x19\n\x15\x41\x43LRULETYPE_UNDEFINED\x10\x00\x12\x14\n\x10\x41\x43LRULETYPE_IPV4\x10\x01\x12\x14\n\x10\x41\x43LRULETYPE_IPV6\x10\x02\x12\x12\n\x0e\x41\x43LRULETYPE_L2\x10\x03\x12\x14\n\x10\x41\x43LRULETYPE_MPLS\x10\x04\x12\x15\n\x11\x41\x43LRULETYPE_MIXED\x10\x05*\x97\x01\n\x14\x41\x63lForwardActionEnum\x12!\n\x1d\x41\x43LFORWARDINGACTION_UNDEFINED\x10\x00\x12\x1c\n\x18\x41\x43LFORWARDINGACTION_DROP\x10\x01\x12\x1e\n\x1a\x41\x43LFORWARDINGACTION_ACCEPT\x10\x02\x12\x1e\n\x1a\x41\x43LFORWARDINGACTION_REJECT\x10\x03*_\n\x10\x41\x63lLogActionEnum\x12\x1a\n\x16\x41\x43LLOGACTION_UNDEFINED\x10\x00\x12\x16\n\x12\x41\x43LLOGACTION_NOLOG\x10\x01\x12\x17\n\x13\x41\x43LLOGACTION_SYSLOG\x10\x02\x62\x06proto3'
+)
+
+_ACLRULETYPEENUM = _descriptor.EnumDescriptor(
+  name='AclRuleTypeEnum',
+  full_name='acl.AclRuleTypeEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ACLRULETYPE_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLRULETYPE_IPV4', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLRULETYPE_IPV6', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLRULETYPE_L2', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLRULETYPE_MPLS', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLRULETYPE_MIXED', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=550,
+  serialized_end=703,
+)
+_sym_db.RegisterEnumDescriptor(_ACLRULETYPEENUM)
+
+AclRuleTypeEnum = enum_type_wrapper.EnumTypeWrapper(_ACLRULETYPEENUM)
+_ACLFORWARDACTIONENUM = _descriptor.EnumDescriptor(
+  name='AclForwardActionEnum',
+  full_name='acl.AclForwardActionEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ACLFORWARDINGACTION_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLFORWARDINGACTION_DROP', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLFORWARDINGACTION_ACCEPT', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLFORWARDINGACTION_REJECT', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=706,
+  serialized_end=857,
+)
+_sym_db.RegisterEnumDescriptor(_ACLFORWARDACTIONENUM)
+
+AclForwardActionEnum = enum_type_wrapper.EnumTypeWrapper(_ACLFORWARDACTIONENUM)
+_ACLLOGACTIONENUM = _descriptor.EnumDescriptor(
+  name='AclLogActionEnum',
+  full_name='acl.AclLogActionEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ACLLOGACTION_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLLOGACTION_NOLOG', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACLLOGACTION_SYSLOG', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=859,
+  serialized_end=954,
+)
+_sym_db.RegisterEnumDescriptor(_ACLLOGACTIONENUM)
+
+AclLogActionEnum = enum_type_wrapper.EnumTypeWrapper(_ACLLOGACTIONENUM)
+ACLRULETYPE_UNDEFINED = 0
+ACLRULETYPE_IPV4 = 1
+ACLRULETYPE_IPV6 = 2
+ACLRULETYPE_L2 = 3
+ACLRULETYPE_MPLS = 4
+ACLRULETYPE_MIXED = 5
+ACLFORWARDINGACTION_UNDEFINED = 0
+ACLFORWARDINGACTION_DROP = 1
+ACLFORWARDINGACTION_ACCEPT = 2
+ACLFORWARDINGACTION_REJECT = 3
+ACLLOGACTION_UNDEFINED = 0
+ACLLOGACTION_NOLOG = 1
+ACLLOGACTION_SYSLOG = 2
+
+
+
+_ACLMATCH = _descriptor.Descriptor(
+  name='AclMatch',
+  full_name='acl.AclMatch',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='dscp', full_name='acl.AclMatch.dscp', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='protocol', full_name='acl.AclMatch.protocol', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='src_address', full_name='acl.AclMatch.src_address', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='dst_address', full_name='acl.AclMatch.dst_address', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='src_port', full_name='acl.AclMatch.src_port', index=4,
+      number=5, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='dst_port', full_name='acl.AclMatch.dst_port', index=5,
+      number=6, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='start_mpls_label', full_name='acl.AclMatch.start_mpls_label', index=6,
+      number=7, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='end_mpls_label', full_name='acl.AclMatch.end_mpls_label', index=7,
+      number=8, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=19,
+  serialized_end=189,
+)
+
+
+_ACLACTION = _descriptor.Descriptor(
+  name='AclAction',
+  full_name='acl.AclAction',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='forward_action', full_name='acl.AclAction.forward_action', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='log_action', full_name='acl.AclAction.log_action', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=191,
+  serialized_end=296,
+)
+
+
+_ACLENTRY = _descriptor.Descriptor(
+  name='AclEntry',
+  full_name='acl.AclEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sequence_id', full_name='acl.AclEntry.sequence_id', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='acl.AclEntry.description', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='match', full_name='acl.AclEntry.match', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='action', full_name='acl.AclEntry.action', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=298,
+  serialized_end=412,
+)
+
+
+_ACLRULESET = _descriptor.Descriptor(
+  name='AclRuleSet',
+  full_name='acl.AclRuleSet',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='acl.AclRuleSet.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='acl.AclRuleSet.type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='acl.AclRuleSet.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='acl.AclRuleSet.user_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='entries', full_name='acl.AclRuleSet.entries', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=415,
+  serialized_end=547,
+)
+
+_ACLACTION.fields_by_name['forward_action'].enum_type = _ACLFORWARDACTIONENUM
+_ACLACTION.fields_by_name['log_action'].enum_type = _ACLLOGACTIONENUM
+_ACLENTRY.fields_by_name['match'].message_type = _ACLMATCH
+_ACLENTRY.fields_by_name['action'].message_type = _ACLACTION
+_ACLRULESET.fields_by_name['type'].enum_type = _ACLRULETYPEENUM
+_ACLRULESET.fields_by_name['entries'].message_type = _ACLENTRY
+DESCRIPTOR.message_types_by_name['AclMatch'] = _ACLMATCH
+DESCRIPTOR.message_types_by_name['AclAction'] = _ACLACTION
+DESCRIPTOR.message_types_by_name['AclEntry'] = _ACLENTRY
+DESCRIPTOR.message_types_by_name['AclRuleSet'] = _ACLRULESET
+DESCRIPTOR.enum_types_by_name['AclRuleTypeEnum'] = _ACLRULETYPEENUM
+DESCRIPTOR.enum_types_by_name['AclForwardActionEnum'] = _ACLFORWARDACTIONENUM
+DESCRIPTOR.enum_types_by_name['AclLogActionEnum'] = _ACLLOGACTIONENUM
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+AclMatch = _reflection.GeneratedProtocolMessageType('AclMatch', (_message.Message,), {
+  'DESCRIPTOR' : _ACLMATCH,
+  '__module__' : 'acl_pb2'
+  # @@protoc_insertion_point(class_scope:acl.AclMatch)
+  })
+_sym_db.RegisterMessage(AclMatch)
+
+AclAction = _reflection.GeneratedProtocolMessageType('AclAction', (_message.Message,), {
+  'DESCRIPTOR' : _ACLACTION,
+  '__module__' : 'acl_pb2'
+  # @@protoc_insertion_point(class_scope:acl.AclAction)
+  })
+_sym_db.RegisterMessage(AclAction)
+
+AclEntry = _reflection.GeneratedProtocolMessageType('AclEntry', (_message.Message,), {
+  'DESCRIPTOR' : _ACLENTRY,
+  '__module__' : 'acl_pb2'
+  # @@protoc_insertion_point(class_scope:acl.AclEntry)
+  })
+_sym_db.RegisterMessage(AclEntry)
+
+AclRuleSet = _reflection.GeneratedProtocolMessageType('AclRuleSet', (_message.Message,), {
+  'DESCRIPTOR' : _ACLRULESET,
+  '__module__' : 'acl_pb2'
+  # @@protoc_insertion_point(class_scope:acl.AclRuleSet)
+  })
+_sym_db.RegisterMessage(AclRuleSet)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/src/context/proto/context_pb2.py b/src/context/proto/context_pb2.py
index 50d501d3ac053ad644554331af26e3c40cd426a1..aa72c655cce55dacc9c924a5dcc421f2b51fea22 100644
--- a/src/context/proto/context_pb2.py
+++ b/src/context/proto/context_pb2.py
@@ -12,6 +12,7 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
+from . import acl_pb2 as acl__pb2
 from . import kpi_sample_types_pb2 as kpi__sample__types__pb2
 
 
@@ -21,9 +22,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\rcontext.proto\x12\x07\x63ontext\x1a\x16kpi_sample_types.proto\"\x07\n\x05\x45mpty\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"F\n\x05\x45vent\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\x12*\n\nevent_type\x18\x02 \x01(\x0e\x32\x16.context.EventTypeEnum\"0\n\tContextId\x12#\n\x0c\x63ontext_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xb6\x01\n\x07\x43ontext\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12)\n\x0ctopology_ids\x18\x02 \x03(\x0b\x32\x13.context.TopologyId\x12\'\n\x0bservice_ids\x18\x03 \x03(\x0b\x32\x12.context.ServiceId\x12/\n\ncontroller\x18\x04 \x01(\x0b\x32\x1b.context.TeraFlowController\"8\n\rContextIdList\x12\'\n\x0b\x63ontext_ids\x18\x01 \x03(\x0b\x32\x12.context.ContextId\"1\n\x0b\x43ontextList\x12\"\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x10.context.Context\"U\n\x0c\x43ontextEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\ncontext_id\x18\x02 \x01(\x0b\x32\x12.context.ContextId\"Z\n\nTopologyId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12$\n\rtopology_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"~\n\x08Topology\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12%\n\ndevice_ids\x18\x02 \x03(\x0b\x32\x11.context.DeviceId\x12!\n\x08link_ids\x18\x03 \x03(\x0b\x32\x0f.context.LinkId\";\n\x0eTopologyIdList\x12)\n\x0ctopology_ids\x18\x01 \x03(\x0b\x32\x13.context.TopologyId\"5\n\x0cTopologyList\x12%\n\ntopologies\x18\x01 \x03(\x0b\x32\x11.context.Topology\"X\n\rTopologyEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12(\n\x0btopology_id\x18\x02 \x01(\x0b\x32\x13.context.TopologyId\".\n\x08\x44\x65viceId\x12\"\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\x9a\x02\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x13\n\x0b\x64\x65vice_type\x18\x02 \x01(\t\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\x12G\n\x19\x64\x65vice_operational_status\x18\x04 \x01(\x0e\x32$.context.DeviceOperationalStatusEnum\x12\x31\n\x0e\x64\x65vice_drivers\x18\x05 \x03(\x0e\x32\x19.context.DeviceDriverEnum\x12+\n\x10\x64\x65vice_endpoints\x18\x06 \x03(\x0b\x32\x11.context.EndPoint\"9\n\x0c\x44\x65viceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"5\n\x0c\x44\x65viceIdList\x12%\n\ndevice_ids\x18\x01 \x03(\x0b\x32\x11.context.DeviceId\".\n\nDeviceList\x12 \n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\x0f.context.Device\"R\n\x0b\x44\x65viceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"*\n\x06LinkId\x12 \n\tlink_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"X\n\x04Link\x12 \n\x07link_id\x18\x01 \x01(\x0b\x32\x0f.context.LinkId\x12.\n\x11link_endpoint_ids\x18\x02 \x03(\x0b\x32\x13.context.EndPointId\"/\n\nLinkIdList\x12!\n\x08link_ids\x18\x01 \x03(\x0b\x32\x0f.context.LinkId\"(\n\x08LinkList\x12\x1c\n\x05links\x18\x01 \x03(\x0b\x32\r.context.Link\"L\n\tLinkEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12 \n\x07link_id\x18\x02 \x01(\x0b\x32\x0f.context.LinkId\"X\n\tServiceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12#\n\x0cservice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xa6\x02\n\x07Service\x12&\n\nservice_id\x18\x01 \x01(\x0b\x32\x12.context.ServiceId\x12.\n\x0cservice_type\x18\x02 \x01(\x0e\x32\x18.context.ServiceTypeEnum\x12\x31\n\x14service_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12\x30\n\x13service_constraints\x18\x04 \x03(\x0b\x32\x13.context.Constraint\x12.\n\x0eservice_status\x18\x05 \x01(\x0b\x32\x16.context.ServiceStatus\x12.\n\x0eservice_config\x18\x06 \x01(\x0b\x32\x16.context.ServiceConfig\"C\n\rServiceStatus\x12\x32\n\x0eservice_status\x18\x01 \x01(\x0e\x32\x1a.context.ServiceStatusEnum\":\n\rServiceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"8\n\rServiceIdList\x12\'\n\x0bservice_ids\x18\x01 \x03(\x0b\x32\x12.context.ServiceId\"1\n\x0bServiceList\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\"U\n\x0cServiceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\"T\n\x07SliceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12!\n\nslice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\x95\x02\n\x05Slice\x12\"\n\x08slice_id\x18\x01 \x01(\x0b\x32\x10.context.SliceId\x12/\n\x12slice_endpoint_ids\x18\x02 \x03(\x0b\x32\x13.context.EndPointId\x12.\n\x11slice_constraints\x18\x03 \x03(\x0b\x32\x13.context.Constraint\x12-\n\x11slice_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12,\n\x12slice_subslice_ids\x18\x05 \x03(\x0b\x32\x10.context.SliceId\x12*\n\x0cslice_status\x18\x06 \x01(\x0b\x32\x14.context.SliceStatus\"=\n\x0bSliceStatus\x12.\n\x0cslice_status\x18\x01 \x01(\x0e\x32\x18.context.SliceStatusEnum\"2\n\x0bSliceIdList\x12#\n\tslice_ids\x18\x01 \x03(\x0b\x32\x10.context.SliceId\"+\n\tSliceList\x12\x1e\n\x06slices\x18\x01 \x03(\x0b\x32\x0e.context.Slice\"O\n\nSliceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12\"\n\x08slice_id\x18\x02 \x01(\x0b\x32\x10.context.SliceId\"6\n\x0c\x43onnectionId\x12&\n\x0f\x63onnection_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xc4\x01\n\nConnection\x12,\n\rconnection_id\x18\x01 \x01(\x0b\x32\x15.context.ConnectionId\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\x12\x33\n\x16path_hops_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\x0fsub_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\"A\n\x10\x43onnectionIdList\x12-\n\x0e\x63onnection_ids\x18\x01 \x03(\x0b\x32\x15.context.ConnectionId\":\n\x0e\x43onnectionList\x12(\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x13.context.Connection\"^\n\x0f\x43onnectionEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12,\n\rconnection_id\x18\x02 \x01(\x0b\x32\x15.context.ConnectionId\"\x82\x01\n\nEndPointId\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12$\n\rendpoint_uuid\x18\x03 \x01(\x0b\x32\r.context.Uuid\"\x86\x01\n\x08\x45ndPoint\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x15\n\rendpoint_type\x18\x02 \x01(\t\x12\x39\n\x10kpi_sample_types\x18\x03 \x03(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\"e\n\nConfigRule\x12)\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x19.context.ConfigActionEnum\x12\x14\n\x0cresource_key\x18\x02 \x01(\t\x12\x16\n\x0eresource_value\x18\x03 \x01(\t\"?\n\nConstraint\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"^\n\x12TeraFlowController\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x12\n\nip_address\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\"U\n\x14\x41uthenticationResult\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x15\n\rauthenticated\x18\x02 \x01(\x08*j\n\rEventTypeEnum\x12\x17\n\x13\x45VENTTYPE_UNDEFINED\x10\x00\x12\x14\n\x10\x45VENTTYPE_CREATE\x10\x01\x12\x14\n\x10\x45VENTTYPE_UPDATE\x10\x02\x12\x14\n\x10\x45VENTTYPE_REMOVE\x10\x03*\xc5\x01\n\x10\x44\x65viceDriverEnum\x12\x1a\n\x16\x44\x45VICEDRIVER_UNDEFINED\x10\x00\x12\x1b\n\x17\x44\x45VICEDRIVER_OPENCONFIG\x10\x01\x12\x1e\n\x1a\x44\x45VICEDRIVER_TRANSPORT_API\x10\x02\x12\x13\n\x0f\x44\x45VICEDRIVER_P4\x10\x03\x12&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOGY\x10\x04\x12\x1b\n\x17\x44\x45VICEDRIVER_ONF_TR_352\x10\x05*\x8f\x01\n\x1b\x44\x65viceOperationalStatusEnum\x12%\n!DEVICEOPERATIONALSTATUS_UNDEFINED\x10\x00\x12$\n DEVICEOPERATIONALSTATUS_DISABLED\x10\x01\x12#\n\x1f\x44\x45VICEOPERATIONALSTATUS_ENABLED\x10\x02*\x81\x01\n\x0fServiceTypeEnum\x12\x17\n\x13SERVICETYPE_UNKNOWN\x10\x00\x12\x14\n\x10SERVICETYPE_L3NM\x10\x01\x12\x14\n\x10SERVICETYPE_L2NM\x10\x02\x12)\n%SERVICETYPE_TAPI_CONNECTIVITY_SERVICE\x10\x03*\x88\x01\n\x11ServiceStatusEnum\x12\x1b\n\x17SERVICESTATUS_UNDEFINED\x10\x00\x12\x19\n\x15SERVICESTATUS_PLANNED\x10\x01\x12\x18\n\x14SERVICESTATUS_ACTIVE\x10\x02\x12!\n\x1dSERVICESTATUS_PENDING_REMOVAL\x10\x03*\x8b\x01\n\x0fSliceStatusEnum\x12\x19\n\x15SLICESTATUS_UNDEFINED\x10\x00\x12\x17\n\x13SLICESTATUS_PLANNED\x10\x01\x12\x14\n\x10SLICESTATUS_INIT\x10\x02\x12\x16\n\x12SLICESTATUS_ACTIVE\x10\x03\x12\x16\n\x12SLICESTATUS_DEINIT\x10\x04*]\n\x10\x43onfigActionEnum\x12\x1a\n\x16\x43ONFIGACTION_UNDEFINED\x10\x00\x12\x14\n\x10\x43ONFIGACTION_SET\x10\x01\x12\x17\n\x13\x43ONFIGACTION_DELETE\x10\x02\x32\xef\x12\n\x0e\x43ontextService\x12:\n\x0eListContextIds\x12\x0e.context.Empty\x1a\x16.context.ContextIdList\"\x00\x12\x36\n\x0cListContexts\x12\x0e.context.Empty\x1a\x14.context.ContextList\"\x00\x12\x34\n\nGetContext\x12\x12.context.ContextId\x1a\x10.context.Context\"\x00\x12\x34\n\nSetContext\x12\x10.context.Context\x1a\x12.context.ContextId\"\x00\x12\x35\n\rRemoveContext\x12\x12.context.ContextId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetContextEvents\x12\x0e.context.Empty\x1a\x15.context.ContextEvent\"\x00\x30\x01\x12@\n\x0fListTopologyIds\x12\x12.context.ContextId\x1a\x17.context.TopologyIdList\"\x00\x12=\n\x0eListTopologies\x12\x12.context.ContextId\x1a\x15.context.TopologyList\"\x00\x12\x37\n\x0bGetTopology\x12\x13.context.TopologyId\x1a\x11.context.Topology\"\x00\x12\x37\n\x0bSetTopology\x12\x11.context.Topology\x1a\x13.context.TopologyId\"\x00\x12\x37\n\x0eRemoveTopology\x12\x13.context.TopologyId\x1a\x0e.context.Empty\"\x00\x12?\n\x11GetTopologyEvents\x12\x0e.context.Empty\x1a\x16.context.TopologyEvent\"\x00\x30\x01\x12\x38\n\rListDeviceIds\x12\x0e.context.Empty\x1a\x15.context.DeviceIdList\"\x00\x12\x34\n\x0bListDevices\x12\x0e.context.Empty\x1a\x13.context.DeviceList\"\x00\x12\x31\n\tGetDevice\x12\x11.context.DeviceId\x1a\x0f.context.Device\"\x00\x12\x31\n\tSetDevice\x12\x0f.context.Device\x1a\x11.context.DeviceId\"\x00\x12\x33\n\x0cRemoveDevice\x12\x11.context.DeviceId\x1a\x0e.context.Empty\"\x00\x12;\n\x0fGetDeviceEvents\x12\x0e.context.Empty\x1a\x14.context.DeviceEvent\"\x00\x30\x01\x12\x34\n\x0bListLinkIds\x12\x0e.context.Empty\x1a\x13.context.LinkIdList\"\x00\x12\x30\n\tListLinks\x12\x0e.context.Empty\x1a\x11.context.LinkList\"\x00\x12+\n\x07GetLink\x12\x0f.context.LinkId\x1a\r.context.Link\"\x00\x12+\n\x07SetLink\x12\r.context.Link\x1a\x0f.context.LinkId\"\x00\x12/\n\nRemoveLink\x12\x0f.context.LinkId\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetLinkEvents\x12\x0e.context.Empty\x1a\x12.context.LinkEvent\"\x00\x30\x01\x12>\n\x0eListServiceIds\x12\x12.context.ContextId\x1a\x16.context.ServiceIdList\"\x00\x12:\n\x0cListServices\x12\x12.context.ContextId\x1a\x14.context.ServiceList\"\x00\x12\x34\n\nGetService\x12\x12.context.ServiceId\x1a\x10.context.Service\"\x00\x12\x34\n\nSetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x35\n\rRemoveService\x12\x12.context.ServiceId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetServiceEvents\x12\x0e.context.Empty\x1a\x15.context.ServiceEvent\"\x00\x30\x01\x12:\n\x0cListSliceIds\x12\x12.context.ContextId\x1a\x14.context.SliceIdList\"\x00\x12\x36\n\nListSlices\x12\x12.context.ContextId\x1a\x12.context.SliceList\"\x00\x12.\n\x08GetSlice\x12\x10.context.SliceId\x1a\x0e.context.Slice\"\x00\x12.\n\x08SetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x31\n\x0bRemoveSlice\x12\x10.context.SliceId\x1a\x0e.context.Empty\"\x00\x12\x39\n\x0eGetSliceEvents\x12\x0e.context.Empty\x1a\x13.context.SliceEvent\"\x00\x30\x01\x12\x44\n\x11ListConnectionIds\x12\x12.context.ServiceId\x1a\x19.context.ConnectionIdList\"\x00\x12@\n\x0fListConnections\x12\x12.context.ServiceId\x1a\x17.context.ConnectionList\"\x00\x12=\n\rGetConnection\x12\x15.context.ConnectionId\x1a\x13.context.Connection\"\x00\x12=\n\rSetConnection\x12\x13.context.Connection\x1a\x15.context.ConnectionId\"\x00\x12;\n\x10RemoveConnection\x12\x15.context.ConnectionId\x1a\x0e.context.Empty\"\x00\x12\x43\n\x13GetConnectionEvents\x12\x0e.context.Empty\x1a\x18.context.ConnectionEvent\"\x00\x30\x01\x62\x06proto3'
+  serialized_pb=b'\n\rcontext.proto\x12\x07\x63ontext\x1a\tacl.proto\x1a\x16kpi_sample_types.proto\"\x07\n\x05\x45mpty\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"F\n\x05\x45vent\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\x12*\n\nevent_type\x18\x02 \x01(\x0e\x32\x16.context.EventTypeEnum\"0\n\tContextId\x12#\n\x0c\x63ontext_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xb6\x01\n\x07\x43ontext\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12)\n\x0ctopology_ids\x18\x02 \x03(\x0b\x32\x13.context.TopologyId\x12\'\n\x0bservice_ids\x18\x03 \x03(\x0b\x32\x12.context.ServiceId\x12/\n\ncontroller\x18\x04 \x01(\x0b\x32\x1b.context.TeraFlowController\"8\n\rContextIdList\x12\'\n\x0b\x63ontext_ids\x18\x01 \x03(\x0b\x32\x12.context.ContextId\"1\n\x0b\x43ontextList\x12\"\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x10.context.Context\"U\n\x0c\x43ontextEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\ncontext_id\x18\x02 \x01(\x0b\x32\x12.context.ContextId\"Z\n\nTopologyId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12$\n\rtopology_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"~\n\x08Topology\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12%\n\ndevice_ids\x18\x02 \x03(\x0b\x32\x11.context.DeviceId\x12!\n\x08link_ids\x18\x03 \x03(\x0b\x32\x0f.context.LinkId\";\n\x0eTopologyIdList\x12)\n\x0ctopology_ids\x18\x01 \x03(\x0b\x32\x13.context.TopologyId\"5\n\x0cTopologyList\x12%\n\ntopologies\x18\x01 \x03(\x0b\x32\x11.context.Topology\"X\n\rTopologyEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12(\n\x0btopology_id\x18\x02 \x01(\x0b\x32\x13.context.TopologyId\".\n\x08\x44\x65viceId\x12\"\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\x9a\x02\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x13\n\x0b\x64\x65vice_type\x18\x02 \x01(\t\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\x12G\n\x19\x64\x65vice_operational_status\x18\x04 \x01(\x0e\x32$.context.DeviceOperationalStatusEnum\x12\x31\n\x0e\x64\x65vice_drivers\x18\x05 \x03(\x0e\x32\x19.context.DeviceDriverEnum\x12+\n\x10\x64\x65vice_endpoints\x18\x06 \x03(\x0b\x32\x11.context.EndPoint\"9\n\x0c\x44\x65viceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"5\n\x0c\x44\x65viceIdList\x12%\n\ndevice_ids\x18\x01 \x03(\x0b\x32\x11.context.DeviceId\".\n\nDeviceList\x12 \n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\x0f.context.Device\"R\n\x0b\x44\x65viceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"*\n\x06LinkId\x12 \n\tlink_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"X\n\x04Link\x12 \n\x07link_id\x18\x01 \x01(\x0b\x32\x0f.context.LinkId\x12.\n\x11link_endpoint_ids\x18\x02 \x03(\x0b\x32\x13.context.EndPointId\"/\n\nLinkIdList\x12!\n\x08link_ids\x18\x01 \x03(\x0b\x32\x0f.context.LinkId\"(\n\x08LinkList\x12\x1c\n\x05links\x18\x01 \x03(\x0b\x32\r.context.Link\"L\n\tLinkEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12 \n\x07link_id\x18\x02 \x01(\x0b\x32\x0f.context.LinkId\"X\n\tServiceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12#\n\x0cservice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xa6\x02\n\x07Service\x12&\n\nservice_id\x18\x01 \x01(\x0b\x32\x12.context.ServiceId\x12.\n\x0cservice_type\x18\x02 \x01(\x0e\x32\x18.context.ServiceTypeEnum\x12\x31\n\x14service_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12\x30\n\x13service_constraints\x18\x04 \x03(\x0b\x32\x13.context.Constraint\x12.\n\x0eservice_status\x18\x05 \x01(\x0b\x32\x16.context.ServiceStatus\x12.\n\x0eservice_config\x18\x06 \x01(\x0b\x32\x16.context.ServiceConfig\"C\n\rServiceStatus\x12\x32\n\x0eservice_status\x18\x01 \x01(\x0e\x32\x1a.context.ServiceStatusEnum\":\n\rServiceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"8\n\rServiceIdList\x12\'\n\x0bservice_ids\x18\x01 \x03(\x0b\x32\x12.context.ServiceId\"1\n\x0bServiceList\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\"U\n\x0cServiceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\"T\n\x07SliceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12!\n\nslice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\x95\x02\n\x05Slice\x12\"\n\x08slice_id\x18\x01 \x01(\x0b\x32\x10.context.SliceId\x12/\n\x12slice_endpoint_ids\x18\x02 \x03(\x0b\x32\x13.context.EndPointId\x12.\n\x11slice_constraints\x18\x03 \x03(\x0b\x32\x13.context.Constraint\x12-\n\x11slice_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12,\n\x12slice_subslice_ids\x18\x05 \x03(\x0b\x32\x10.context.SliceId\x12*\n\x0cslice_status\x18\x06 \x01(\x0b\x32\x14.context.SliceStatus\"=\n\x0bSliceStatus\x12.\n\x0cslice_status\x18\x01 \x01(\x0e\x32\x18.context.SliceStatusEnum\"2\n\x0bSliceIdList\x12#\n\tslice_ids\x18\x01 \x03(\x0b\x32\x10.context.SliceId\"+\n\tSliceList\x12\x1e\n\x06slices\x18\x01 \x03(\x0b\x32\x0e.context.Slice\"O\n\nSliceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12\"\n\x08slice_id\x18\x02 \x01(\x0b\x32\x10.context.SliceId\"6\n\x0c\x43onnectionId\x12&\n\x0f\x63onnection_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"2\n\x15\x43onnectionSettings_L0\x12\x19\n\x11lsp_symbolic_name\x18\x01 \x01(\t\"\x9e\x01\n\x15\x43onnectionSettings_L2\x12\x17\n\x0fsrc_mac_address\x18\x01 \x01(\t\x12\x17\n\x0f\x64st_mac_address\x18\x02 \x01(\t\x12\x12\n\nether_type\x18\x03 \x01(\r\x12\x0f\n\x07vlan_id\x18\x04 \x01(\r\x12\x12\n\nmpls_label\x18\x05 \x01(\r\x12\x1a\n\x12mpls_traffic_class\x18\x06 \x01(\r\"t\n\x15\x43onnectionSettings_L3\x12\x16\n\x0esrc_ip_address\x18\x01 \x01(\t\x12\x16\n\x0e\x64st_ip_address\x18\x02 \x01(\t\x12\x0c\n\x04\x64scp\x18\x03 \x01(\r\x12\x10\n\x08protocol\x18\x04 \x01(\r\x12\x0b\n\x03ttl\x18\x05 \x01(\r\"[\n\x15\x43onnectionSettings_L4\x12\x10\n\x08src_port\x18\x01 \x01(\r\x12\x10\n\x08\x64st_port\x18\x02 \x01(\r\x12\x11\n\ttcp_flags\x18\x03 \x01(\r\x12\x0b\n\x03ttl\x18\x04 \x01(\r\"\xc4\x01\n\x12\x43onnectionSettings\x12*\n\x02l0\x18\x01 \x01(\x0b\x32\x1e.context.ConnectionSettings_L0\x12*\n\x02l2\x18\x02 \x01(\x0b\x32\x1e.context.ConnectionSettings_L2\x12*\n\x02l3\x18\x03 \x01(\x0b\x32\x1e.context.ConnectionSettings_L3\x12*\n\x02l4\x18\x04 \x01(\x0b\x32\x1e.context.ConnectionSettings_L4\"\xf3\x01\n\nConnection\x12,\n\rconnection_id\x18\x01 \x01(\x0b\x32\x15.context.ConnectionId\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\x12\x33\n\x16path_hops_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\x0fsub_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12-\n\x08settings\x18\x05 \x01(\x0b\x32\x1b.context.ConnectionSettings\"A\n\x10\x43onnectionIdList\x12-\n\x0e\x63onnection_ids\x18\x01 \x03(\x0b\x32\x15.context.ConnectionId\":\n\x0e\x43onnectionList\x12(\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x13.context.Connection\"^\n\x0f\x43onnectionEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12,\n\rconnection_id\x18\x02 \x01(\x0b\x32\x15.context.ConnectionId\"\x82\x01\n\nEndPointId\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12$\n\rendpoint_uuid\x18\x03 \x01(\x0b\x32\r.context.Uuid\"\x86\x01\n\x08\x45ndPoint\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x15\n\rendpoint_type\x18\x02 \x01(\t\x12\x39\n\x10kpi_sample_types\x18\x03 \x03(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\"A\n\x11\x43onfigRule_Custom\x12\x14\n\x0cresource_key\x18\x01 \x01(\t\x12\x16\n\x0eresource_value\x18\x02 \x01(\t\"]\n\x0e\x43onfigRule_ACL\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12!\n\x08rule_set\x18\x02 \x01(\x0b\x32\x0f.acl.AclRuleSet\"\x9c\x01\n\nConfigRule\x12)\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x19.context.ConfigActionEnum\x12,\n\x06\x63ustom\x18\x02 \x01(\x0b\x32\x1a.context.ConfigRule_CustomH\x00\x12&\n\x03\x61\x63l\x18\x03 \x01(\x0b\x32\x17.context.ConfigRule_ACLH\x00\x42\r\n\x0b\x63onfig_rule\"F\n\x11\x43onstraint_Custom\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"E\n\x13\x43onstraint_Schedule\x12\x17\n\x0fstart_timestamp\x18\x01 \x01(\x02\x12\x15\n\rduration_days\x18\x02 \x01(\x02\"3\n\x0cGPS_Position\x12\x10\n\x08latitude\x18\x01 \x01(\x02\x12\x11\n\tlongitude\x18\x02 \x01(\x02\"\x94\x01\n\x1b\x43onstraint_EndPointLocation\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x10\n\x06region\x18\x02 \x01(\tH\x00\x12-\n\x0cgps_position\x18\x03 \x01(\x0b\x32\x15.context.GPS_PositionH\x00\x42\n\n\x08location\"0\n\x16\x43onstraint_SLA_Latency\x12\x16\n\x0e\x65\x32\x65_latency_ms\x18\x01 \x01(\x02\"0\n\x17\x43onstraint_SLA_Capacity\x12\x15\n\rcapacity_gbps\x18\x01 \x01(\x02\"M\n\x1b\x43onstraint_SLA_Availability\x12\x1a\n\x12num_disjoint_paths\x18\x01 \x01(\r\x12\x12\n\nall_active\x18\x02 \x01(\x08\"\xf1\x02\n\nConstraint\x12,\n\x06\x63ustom\x18\x01 \x01(\x0b\x32\x1a.context.Constraint_CustomH\x00\x12\x30\n\x08schedule\x18\x02 \x01(\x0b\x32\x1c.context.Constraint_ScheduleH\x00\x12\x41\n\x11\x65ndpoint_location\x18\x03 \x01(\x0b\x32$.context.Constraint_EndPointLocationH\x00\x12\x38\n\x0csla_capacity\x18\x04 \x01(\x0b\x32 .context.Constraint_SLA_CapacityH\x00\x12\x36\n\x0bsla_latency\x18\x05 \x01(\x0b\x32\x1f.context.Constraint_SLA_LatencyH\x00\x12@\n\x10sla_availability\x18\x06 \x01(\x0b\x32$.context.Constraint_SLA_AvailabilityH\x00\x42\x0c\n\nconstraint\"^\n\x12TeraFlowController\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x12\n\nip_address\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\"U\n\x14\x41uthenticationResult\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x15\n\rauthenticated\x18\x02 \x01(\x08*j\n\rEventTypeEnum\x12\x17\n\x13\x45VENTTYPE_UNDEFINED\x10\x00\x12\x14\n\x10\x45VENTTYPE_CREATE\x10\x01\x12\x14\n\x10\x45VENTTYPE_UPDATE\x10\x02\x12\x14\n\x10\x45VENTTYPE_REMOVE\x10\x03*\xc5\x01\n\x10\x44\x65viceDriverEnum\x12\x1a\n\x16\x44\x45VICEDRIVER_UNDEFINED\x10\x00\x12\x1b\n\x17\x44\x45VICEDRIVER_OPENCONFIG\x10\x01\x12\x1e\n\x1a\x44\x45VICEDRIVER_TRANSPORT_API\x10\x02\x12\x13\n\x0f\x44\x45VICEDRIVER_P4\x10\x03\x12&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOGY\x10\x04\x12\x1b\n\x17\x44\x45VICEDRIVER_ONF_TR_352\x10\x05*\x8f\x01\n\x1b\x44\x65viceOperationalStatusEnum\x12%\n!DEVICEOPERATIONALSTATUS_UNDEFINED\x10\x00\x12$\n DEVICEOPERATIONALSTATUS_DISABLED\x10\x01\x12#\n\x1f\x44\x45VICEOPERATIONALSTATUS_ENABLED\x10\x02*\x81\x01\n\x0fServiceTypeEnum\x12\x17\n\x13SERVICETYPE_UNKNOWN\x10\x00\x12\x14\n\x10SERVICETYPE_L3NM\x10\x01\x12\x14\n\x10SERVICETYPE_L2NM\x10\x02\x12)\n%SERVICETYPE_TAPI_CONNECTIVITY_SERVICE\x10\x03*\x88\x01\n\x11ServiceStatusEnum\x12\x1b\n\x17SERVICESTATUS_UNDEFINED\x10\x00\x12\x19\n\x15SERVICESTATUS_PLANNED\x10\x01\x12\x18\n\x14SERVICESTATUS_ACTIVE\x10\x02\x12!\n\x1dSERVICESTATUS_PENDING_REMOVAL\x10\x03*\x8b\x01\n\x0fSliceStatusEnum\x12\x19\n\x15SLICESTATUS_UNDEFINED\x10\x00\x12\x17\n\x13SLICESTATUS_PLANNED\x10\x01\x12\x14\n\x10SLICESTATUS_INIT\x10\x02\x12\x16\n\x12SLICESTATUS_ACTIVE\x10\x03\x12\x16\n\x12SLICESTATUS_DEINIT\x10\x04*]\n\x10\x43onfigActionEnum\x12\x1a\n\x16\x43ONFIGACTION_UNDEFINED\x10\x00\x12\x14\n\x10\x43ONFIGACTION_SET\x10\x01\x12\x17\n\x13\x43ONFIGACTION_DELETE\x10\x02\x32\xef\x12\n\x0e\x43ontextService\x12:\n\x0eListContextIds\x12\x0e.context.Empty\x1a\x16.context.ContextIdList\"\x00\x12\x36\n\x0cListContexts\x12\x0e.context.Empty\x1a\x14.context.ContextList\"\x00\x12\x34\n\nGetContext\x12\x12.context.ContextId\x1a\x10.context.Context\"\x00\x12\x34\n\nSetContext\x12\x10.context.Context\x1a\x12.context.ContextId\"\x00\x12\x35\n\rRemoveContext\x12\x12.context.ContextId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetContextEvents\x12\x0e.context.Empty\x1a\x15.context.ContextEvent\"\x00\x30\x01\x12@\n\x0fListTopologyIds\x12\x12.context.ContextId\x1a\x17.context.TopologyIdList\"\x00\x12=\n\x0eListTopologies\x12\x12.context.ContextId\x1a\x15.context.TopologyList\"\x00\x12\x37\n\x0bGetTopology\x12\x13.context.TopologyId\x1a\x11.context.Topology\"\x00\x12\x37\n\x0bSetTopology\x12\x11.context.Topology\x1a\x13.context.TopologyId\"\x00\x12\x37\n\x0eRemoveTopology\x12\x13.context.TopologyId\x1a\x0e.context.Empty\"\x00\x12?\n\x11GetTopologyEvents\x12\x0e.context.Empty\x1a\x16.context.TopologyEvent\"\x00\x30\x01\x12\x38\n\rListDeviceIds\x12\x0e.context.Empty\x1a\x15.context.DeviceIdList\"\x00\x12\x34\n\x0bListDevices\x12\x0e.context.Empty\x1a\x13.context.DeviceList\"\x00\x12\x31\n\tGetDevice\x12\x11.context.DeviceId\x1a\x0f.context.Device\"\x00\x12\x31\n\tSetDevice\x12\x0f.context.Device\x1a\x11.context.DeviceId\"\x00\x12\x33\n\x0cRemoveDevice\x12\x11.context.DeviceId\x1a\x0e.context.Empty\"\x00\x12;\n\x0fGetDeviceEvents\x12\x0e.context.Empty\x1a\x14.context.DeviceEvent\"\x00\x30\x01\x12\x34\n\x0bListLinkIds\x12\x0e.context.Empty\x1a\x13.context.LinkIdList\"\x00\x12\x30\n\tListLinks\x12\x0e.context.Empty\x1a\x11.context.LinkList\"\x00\x12+\n\x07GetLink\x12\x0f.context.LinkId\x1a\r.context.Link\"\x00\x12+\n\x07SetLink\x12\r.context.Link\x1a\x0f.context.LinkId\"\x00\x12/\n\nRemoveLink\x12\x0f.context.LinkId\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetLinkEvents\x12\x0e.context.Empty\x1a\x12.context.LinkEvent\"\x00\x30\x01\x12>\n\x0eListServiceIds\x12\x12.context.ContextId\x1a\x16.context.ServiceIdList\"\x00\x12:\n\x0cListServices\x12\x12.context.ContextId\x1a\x14.context.ServiceList\"\x00\x12\x34\n\nGetService\x12\x12.context.ServiceId\x1a\x10.context.Service\"\x00\x12\x34\n\nSetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x35\n\rRemoveService\x12\x12.context.ServiceId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetServiceEvents\x12\x0e.context.Empty\x1a\x15.context.ServiceEvent\"\x00\x30\x01\x12:\n\x0cListSliceIds\x12\x12.context.ContextId\x1a\x14.context.SliceIdList\"\x00\x12\x36\n\nListSlices\x12\x12.context.ContextId\x1a\x12.context.SliceList\"\x00\x12.\n\x08GetSlice\x12\x10.context.SliceId\x1a\x0e.context.Slice\"\x00\x12.\n\x08SetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x31\n\x0bRemoveSlice\x12\x10.context.SliceId\x1a\x0e.context.Empty\"\x00\x12\x39\n\x0eGetSliceEvents\x12\x0e.context.Empty\x1a\x13.context.SliceEvent\"\x00\x30\x01\x12\x44\n\x11ListConnectionIds\x12\x12.context.ServiceId\x1a\x19.context.ConnectionIdList\"\x00\x12@\n\x0fListConnections\x12\x12.context.ServiceId\x1a\x17.context.ConnectionList\"\x00\x12=\n\rGetConnection\x12\x15.context.ConnectionId\x1a\x13.context.Connection\"\x00\x12=\n\rSetConnection\x12\x13.context.Connection\x1a\x15.context.ConnectionId\"\x00\x12;\n\x10RemoveConnection\x12\x15.context.ConnectionId\x1a\x0e.context.Empty\"\x00\x12\x43\n\x13GetConnectionEvents\x12\x0e.context.Empty\x1a\x18.context.ConnectionEvent\"\x00\x30\x01\x62\x06proto3'
   ,
-  dependencies=[kpi__sample__types__pb2.DESCRIPTOR,])
+  dependencies=[acl__pb2.DESCRIPTOR,kpi__sample__types__pb2.DESCRIPTOR,])
 
 _EVENTTYPEENUM = _descriptor.EnumDescriptor(
   name='EventTypeEnum',
@@ -55,8 +56,8 @@ _EVENTTYPEENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=4310,
-  serialized_end=4416,
+  serialized_start=6042,
+  serialized_end=6148,
 )
 _sym_db.RegisterEnumDescriptor(_EVENTTYPEENUM)
 
@@ -101,8 +102,8 @@ _DEVICEDRIVERENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=4419,
-  serialized_end=4616,
+  serialized_start=6151,
+  serialized_end=6348,
 )
 _sym_db.RegisterEnumDescriptor(_DEVICEDRIVERENUM)
 
@@ -132,8 +133,8 @@ _DEVICEOPERATIONALSTATUSENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=4619,
-  serialized_end=4762,
+  serialized_start=6351,
+  serialized_end=6494,
 )
 _sym_db.RegisterEnumDescriptor(_DEVICEOPERATIONALSTATUSENUM)
 
@@ -168,8 +169,8 @@ _SERVICETYPEENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=4765,
-  serialized_end=4894,
+  serialized_start=6497,
+  serialized_end=6626,
 )
 _sym_db.RegisterEnumDescriptor(_SERVICETYPEENUM)
 
@@ -204,8 +205,8 @@ _SERVICESTATUSENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=4897,
-  serialized_end=5033,
+  serialized_start=6629,
+  serialized_end=6765,
 )
 _sym_db.RegisterEnumDescriptor(_SERVICESTATUSENUM)
 
@@ -245,8 +246,8 @@ _SLICESTATUSENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=5036,
-  serialized_end=5175,
+  serialized_start=6768,
+  serialized_end=6907,
 )
 _sym_db.RegisterEnumDescriptor(_SLICESTATUSENUM)
 
@@ -276,8 +277,8 @@ _CONFIGACTIONENUM = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=5177,
-  serialized_end=5270,
+  serialized_start=6909,
+  serialized_end=7002,
 )
 _sym_db.RegisterEnumDescriptor(_CONFIGACTIONENUM)
 
@@ -334,8 +335,8 @@ _EMPTY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=50,
-  serialized_end=57,
+  serialized_start=61,
+  serialized_end=68,
 )
 
 
@@ -366,8 +367,8 @@ _UUID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=59,
-  serialized_end=79,
+  serialized_start=70,
+  serialized_end=90,
 )
 
 
@@ -405,8 +406,8 @@ _EVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=81,
-  serialized_end=151,
+  serialized_start=92,
+  serialized_end=162,
 )
 
 
@@ -437,8 +438,8 @@ _CONTEXTID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=153,
-  serialized_end=201,
+  serialized_start=164,
+  serialized_end=212,
 )
 
 
@@ -490,8 +491,8 @@ _CONTEXT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=204,
-  serialized_end=386,
+  serialized_start=215,
+  serialized_end=397,
 )
 
 
@@ -522,8 +523,8 @@ _CONTEXTIDLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=388,
-  serialized_end=444,
+  serialized_start=399,
+  serialized_end=455,
 )
 
 
@@ -554,8 +555,8 @@ _CONTEXTLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=446,
-  serialized_end=495,
+  serialized_start=457,
+  serialized_end=506,
 )
 
 
@@ -593,8 +594,8 @@ _CONTEXTEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=497,
-  serialized_end=582,
+  serialized_start=508,
+  serialized_end=593,
 )
 
 
@@ -632,8 +633,8 @@ _TOPOLOGYID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=584,
-  serialized_end=674,
+  serialized_start=595,
+  serialized_end=685,
 )
 
 
@@ -678,8 +679,8 @@ _TOPOLOGY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=676,
-  serialized_end=802,
+  serialized_start=687,
+  serialized_end=813,
 )
 
 
@@ -710,8 +711,8 @@ _TOPOLOGYIDLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=804,
-  serialized_end=863,
+  serialized_start=815,
+  serialized_end=874,
 )
 
 
@@ -742,8 +743,8 @@ _TOPOLOGYLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=865,
-  serialized_end=918,
+  serialized_start=876,
+  serialized_end=929,
 )
 
 
@@ -781,8 +782,8 @@ _TOPOLOGYEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=920,
-  serialized_end=1008,
+  serialized_start=931,
+  serialized_end=1019,
 )
 
 
@@ -813,8 +814,8 @@ _DEVICEID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1010,
-  serialized_end=1056,
+  serialized_start=1021,
+  serialized_end=1067,
 )
 
 
@@ -880,8 +881,8 @@ _DEVICE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1059,
-  serialized_end=1341,
+  serialized_start=1070,
+  serialized_end=1352,
 )
 
 
@@ -912,8 +913,8 @@ _DEVICECONFIG = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1343,
-  serialized_end=1400,
+  serialized_start=1354,
+  serialized_end=1411,
 )
 
 
@@ -944,8 +945,8 @@ _DEVICEIDLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1402,
-  serialized_end=1455,
+  serialized_start=1413,
+  serialized_end=1466,
 )
 
 
@@ -976,8 +977,8 @@ _DEVICELIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1457,
-  serialized_end=1503,
+  serialized_start=1468,
+  serialized_end=1514,
 )
 
 
@@ -1015,8 +1016,8 @@ _DEVICEEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1505,
-  serialized_end=1587,
+  serialized_start=1516,
+  serialized_end=1598,
 )
 
 
@@ -1047,8 +1048,8 @@ _LINKID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1589,
-  serialized_end=1631,
+  serialized_start=1600,
+  serialized_end=1642,
 )
 
 
@@ -1086,8 +1087,8 @@ _LINK = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1633,
-  serialized_end=1721,
+  serialized_start=1644,
+  serialized_end=1732,
 )
 
 
@@ -1118,8 +1119,8 @@ _LINKIDLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1723,
-  serialized_end=1770,
+  serialized_start=1734,
+  serialized_end=1781,
 )
 
 
@@ -1150,8 +1151,8 @@ _LINKLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1772,
-  serialized_end=1812,
+  serialized_start=1783,
+  serialized_end=1823,
 )
 
 
@@ -1189,8 +1190,8 @@ _LINKEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1814,
-  serialized_end=1890,
+  serialized_start=1825,
+  serialized_end=1901,
 )
 
 
@@ -1228,8 +1229,8 @@ _SERVICEID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1892,
-  serialized_end=1980,
+  serialized_start=1903,
+  serialized_end=1991,
 )
 
 
@@ -1295,8 +1296,8 @@ _SERVICE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1983,
-  serialized_end=2277,
+  serialized_start=1994,
+  serialized_end=2288,
 )
 
 
@@ -1327,8 +1328,8 @@ _SERVICESTATUS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2279,
-  serialized_end=2346,
+  serialized_start=2290,
+  serialized_end=2357,
 )
 
 
@@ -1359,8 +1360,8 @@ _SERVICECONFIG = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2348,
-  serialized_end=2406,
+  serialized_start=2359,
+  serialized_end=2417,
 )
 
 
@@ -1391,8 +1392,8 @@ _SERVICEIDLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2408,
-  serialized_end=2464,
+  serialized_start=2419,
+  serialized_end=2475,
 )
 
 
@@ -1423,8 +1424,8 @@ _SERVICELIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2466,
-  serialized_end=2515,
+  serialized_start=2477,
+  serialized_end=2526,
 )
 
 
@@ -1462,8 +1463,8 @@ _SERVICEEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2517,
-  serialized_end=2602,
+  serialized_start=2528,
+  serialized_end=2613,
 )
 
 
@@ -1501,8 +1502,8 @@ _SLICEID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2604,
-  serialized_end=2688,
+  serialized_start=2615,
+  serialized_end=2699,
 )
 
 
@@ -1568,8 +1569,8 @@ _SLICE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2691,
-  serialized_end=2968,
+  serialized_start=2702,
+  serialized_end=2979,
 )
 
 
@@ -1600,8 +1601,8 @@ _SLICESTATUS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2970,
-  serialized_end=3031,
+  serialized_start=2981,
+  serialized_end=3042,
 )
 
 
@@ -1632,8 +1633,8 @@ _SLICEIDLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3033,
-  serialized_end=3083,
+  serialized_start=3044,
+  serialized_end=3094,
 )
 
 
@@ -1664,8 +1665,8 @@ _SLICELIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3085,
-  serialized_end=3128,
+  serialized_start=3096,
+  serialized_end=3139,
 )
 
 
@@ -1703,8 +1704,8 @@ _SLICEEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3130,
-  serialized_end=3209,
+  serialized_start=3141,
+  serialized_end=3220,
 )
 
 
@@ -1735,8 +1736,273 @@ _CONNECTIONID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3211,
-  serialized_end=3265,
+  serialized_start=3222,
+  serialized_end=3276,
+)
+
+
+_CONNECTIONSETTINGS_L0 = _descriptor.Descriptor(
+  name='ConnectionSettings_L0',
+  full_name='context.ConnectionSettings_L0',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='lsp_symbolic_name', full_name='context.ConnectionSettings_L0.lsp_symbolic_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3278,
+  serialized_end=3328,
+)
+
+
+_CONNECTIONSETTINGS_L2 = _descriptor.Descriptor(
+  name='ConnectionSettings_L2',
+  full_name='context.ConnectionSettings_L2',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='src_mac_address', full_name='context.ConnectionSettings_L2.src_mac_address', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='dst_mac_address', full_name='context.ConnectionSettings_L2.dst_mac_address', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ether_type', full_name='context.ConnectionSettings_L2.ether_type', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='vlan_id', full_name='context.ConnectionSettings_L2.vlan_id', index=3,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mpls_label', full_name='context.ConnectionSettings_L2.mpls_label', index=4,
+      number=5, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mpls_traffic_class', full_name='context.ConnectionSettings_L2.mpls_traffic_class', index=5,
+      number=6, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3331,
+  serialized_end=3489,
+)
+
+
+_CONNECTIONSETTINGS_L3 = _descriptor.Descriptor(
+  name='ConnectionSettings_L3',
+  full_name='context.ConnectionSettings_L3',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='src_ip_address', full_name='context.ConnectionSettings_L3.src_ip_address', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='dst_ip_address', full_name='context.ConnectionSettings_L3.dst_ip_address', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='dscp', full_name='context.ConnectionSettings_L3.dscp', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='protocol', full_name='context.ConnectionSettings_L3.protocol', index=3,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ttl', full_name='context.ConnectionSettings_L3.ttl', index=4,
+      number=5, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3491,
+  serialized_end=3607,
+)
+
+
+_CONNECTIONSETTINGS_L4 = _descriptor.Descriptor(
+  name='ConnectionSettings_L4',
+  full_name='context.ConnectionSettings_L4',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='src_port', full_name='context.ConnectionSettings_L4.src_port', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='dst_port', full_name='context.ConnectionSettings_L4.dst_port', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tcp_flags', full_name='context.ConnectionSettings_L4.tcp_flags', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ttl', full_name='context.ConnectionSettings_L4.ttl', index=3,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3609,
+  serialized_end=3700,
+)
+
+
+_CONNECTIONSETTINGS = _descriptor.Descriptor(
+  name='ConnectionSettings',
+  full_name='context.ConnectionSettings',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='l0', full_name='context.ConnectionSettings.l0', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='l2', full_name='context.ConnectionSettings.l2', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='l3', full_name='context.ConnectionSettings.l3', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='l4', full_name='context.ConnectionSettings.l4', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3703,
+  serialized_end=3899,
 )
 
 
@@ -1749,30 +2015,310 @@ _CONNECTION = _descriptor.Descriptor(
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='connection_id', full_name='context.Connection.connection_id', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='connection_id', full_name='context.Connection.connection_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_id', full_name='context.Connection.service_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='path_hops_endpoint_ids', full_name='context.Connection.path_hops_endpoint_ids', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sub_service_ids', full_name='context.Connection.sub_service_ids', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='settings', full_name='context.Connection.settings', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3902,
+  serialized_end=4145,
+)
+
+
+_CONNECTIONIDLIST = _descriptor.Descriptor(
+  name='ConnectionIdList',
+  full_name='context.ConnectionIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='connection_ids', full_name='context.ConnectionIdList.connection_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4147,
+  serialized_end=4212,
+)
+
+
+_CONNECTIONLIST = _descriptor.Descriptor(
+  name='ConnectionList',
+  full_name='context.ConnectionList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='connections', full_name='context.ConnectionList.connections', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4214,
+  serialized_end=4272,
+)
+
+
+_CONNECTIONEVENT = _descriptor.Descriptor(
+  name='ConnectionEvent',
+  full_name='context.ConnectionEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.ConnectionEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='connection_id', full_name='context.ConnectionEvent.connection_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4274,
+  serialized_end=4368,
+)
+
+
+_ENDPOINTID = _descriptor.Descriptor(
+  name='EndPointId',
+  full_name='context.EndPointId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topology_id', full_name='context.EndPointId.topology_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_id', full_name='context.EndPointId.device_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='endpoint_uuid', full_name='context.EndPointId.endpoint_uuid', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4371,
+  serialized_end=4501,
+)
+
+
+_ENDPOINT = _descriptor.Descriptor(
+  name='EndPoint',
+  full_name='context.EndPoint',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='endpoint_id', full_name='context.EndPoint.endpoint_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='endpoint_type', full_name='context.EndPoint.endpoint_type', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='kpi_sample_types', full_name='context.EndPoint.kpi_sample_types', index=2,
+      number=3, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4504,
+  serialized_end=4638,
+)
+
+
+_CONFIGRULE_CUSTOM = _descriptor.Descriptor(
+  name='ConfigRule_Custom',
+  full_name='context.ConfigRule_Custom',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='resource_key', full_name='context.ConfigRule_Custom.resource_key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='service_id', full_name='context.Connection.service_id', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='resource_value', full_name='context.ConfigRule_Custom.resource_value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4640,
+  serialized_end=4705,
+)
+
+
+_CONFIGRULE_ACL = _descriptor.Descriptor(
+  name='ConfigRule_ACL',
+  full_name='context.ConfigRule_ACL',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
     _descriptor.FieldDescriptor(
-      name='path_hops_endpoint_ids', full_name='context.Connection.path_hops_endpoint_ids', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
+      name='endpoint_id', full_name='context.ConfigRule_ACL.endpoint_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='sub_service_ids', full_name='context.Connection.sub_service_ids', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
+      name='rule_set', full_name='context.ConfigRule_ACL.rule_set', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1788,23 +2334,37 @@ _CONNECTION = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3268,
-  serialized_end=3464,
+  serialized_start=4707,
+  serialized_end=4800,
 )
 
 
-_CONNECTIONIDLIST = _descriptor.Descriptor(
-  name='ConnectionIdList',
-  full_name='context.ConnectionIdList',
+_CONFIGRULE = _descriptor.Descriptor(
+  name='ConfigRule',
+  full_name='context.ConfigRule',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='connection_ids', full_name='context.ConnectionIdList.connection_ids', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
+      name='action', full_name='context.ConfigRule.action', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custom', full_name='context.ConfigRule.custom', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='acl', full_name='context.ConfigRule.acl', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1819,24 +2379,36 @@ _CONNECTIONIDLIST = _descriptor.Descriptor(
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
-  ],
-  serialized_start=3466,
-  serialized_end=3531,
+    _descriptor.OneofDescriptor(
+      name='config_rule', full_name='context.ConfigRule.config_rule',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=4803,
+  serialized_end=4959,
 )
 
 
-_CONNECTIONLIST = _descriptor.Descriptor(
-  name='ConnectionList',
-  full_name='context.ConnectionList',
+_CONSTRAINT_CUSTOM = _descriptor.Descriptor(
+  name='Constraint_Custom',
+  full_name='context.Constraint_Custom',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='connections', full_name='context.ConnectionList.connections', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
+      name='constraint_type', full_name='context.Constraint_Custom.constraint_type', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='constraint_value', full_name='context.Constraint_Custom.constraint_value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1852,30 +2424,30 @@ _CONNECTIONLIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3533,
-  serialized_end=3591,
+  serialized_start=4961,
+  serialized_end=5031,
 )
 
 
-_CONNECTIONEVENT = _descriptor.Descriptor(
-  name='ConnectionEvent',
-  full_name='context.ConnectionEvent',
+_CONSTRAINT_SCHEDULE = _descriptor.Descriptor(
+  name='Constraint_Schedule',
+  full_name='context.Constraint_Schedule',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='event', full_name='context.ConnectionEvent.event', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='start_timestamp', full_name='context.Constraint_Schedule.start_timestamp', index=0,
+      number=1, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='connection_id', full_name='context.ConnectionEvent.connection_id', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='duration_days', full_name='context.Constraint_Schedule.duration_days', index=1,
+      number=2, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1891,37 +2463,30 @@ _CONNECTIONEVENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3593,
-  serialized_end=3687,
+  serialized_start=5033,
+  serialized_end=5102,
 )
 
 
-_ENDPOINTID = _descriptor.Descriptor(
-  name='EndPointId',
-  full_name='context.EndPointId',
+_GPS_POSITION = _descriptor.Descriptor(
+  name='GPS_Position',
+  full_name='context.GPS_Position',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='topology_id', full_name='context.EndPointId.topology_id', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='device_id', full_name='context.EndPointId.device_id', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='latitude', full_name='context.GPS_Position.latitude', index=0,
+      number=1, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='endpoint_uuid', full_name='context.EndPointId.endpoint_uuid', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='longitude', full_name='context.GPS_Position.longitude', index=1,
+      number=2, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1937,37 +2502,74 @@ _ENDPOINTID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3690,
-  serialized_end=3820,
+  serialized_start=5104,
+  serialized_end=5155,
 )
 
 
-_ENDPOINT = _descriptor.Descriptor(
-  name='EndPoint',
-  full_name='context.EndPoint',
+_CONSTRAINT_ENDPOINTLOCATION = _descriptor.Descriptor(
+  name='Constraint_EndPointLocation',
+  full_name='context.Constraint_EndPointLocation',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='endpoint_id', full_name='context.EndPoint.endpoint_id', index=0,
+      name='endpoint_id', full_name='context.Constraint_EndPointLocation.endpoint_id', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='endpoint_type', full_name='context.EndPoint.endpoint_type', index=1,
+      name='region', full_name='context.Constraint_EndPointLocation.region', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='kpi_sample_types', full_name='context.EndPoint.kpi_sample_types', index=2,
-      number=3, type=14, cpp_type=8, label=3,
-      has_default_value=False, default_value=[],
+      name='gps_position', full_name='context.Constraint_EndPointLocation.gps_position', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='location', full_name='context.Constraint_EndPointLocation.location',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=5158,
+  serialized_end=5306,
+)
+
+
+_CONSTRAINT_SLA_LATENCY = _descriptor.Descriptor(
+  name='Constraint_SLA_Latency',
+  full_name='context.Constraint_SLA_Latency',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='e2e_latency_ms', full_name='context.Constraint_SLA_Latency.e2e_latency_ms', index=0,
+      number=1, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1983,37 +2585,62 @@ _ENDPOINT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3823,
-  serialized_end=3957,
+  serialized_start=5308,
+  serialized_end=5356,
 )
 
 
-_CONFIGRULE = _descriptor.Descriptor(
-  name='ConfigRule',
-  full_name='context.ConfigRule',
+_CONSTRAINT_SLA_CAPACITY = _descriptor.Descriptor(
+  name='Constraint_SLA_Capacity',
+  full_name='context.Constraint_SLA_Capacity',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='action', full_name='context.ConfigRule.action', index=0,
-      number=1, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      name='capacity_gbps', full_name='context.Constraint_SLA_Capacity.capacity_gbps', index=0,
+      number=1, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5358,
+  serialized_end=5406,
+)
+
+
+_CONSTRAINT_SLA_AVAILABILITY = _descriptor.Descriptor(
+  name='Constraint_SLA_Availability',
+  full_name='context.Constraint_SLA_Availability',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
     _descriptor.FieldDescriptor(
-      name='resource_key', full_name='context.ConfigRule.resource_key', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='num_disjoint_paths', full_name='context.Constraint_SLA_Availability.num_disjoint_paths', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='resource_value', full_name='context.ConfigRule.resource_value', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='all_active', full_name='context.Constraint_SLA_Availability.all_active', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -2029,8 +2656,8 @@ _CONFIGRULE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3959,
-  serialized_end=4060,
+  serialized_start=5408,
+  serialized_end=5485,
 )
 
 
@@ -2043,16 +2670,44 @@ _CONSTRAINT = _descriptor.Descriptor(
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='constraint_type', full_name='context.Constraint.constraint_type', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='custom', full_name='context.Constraint.custom', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='constraint_value', full_name='context.Constraint.constraint_value', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='schedule', full_name='context.Constraint.schedule', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='endpoint_location', full_name='context.Constraint.endpoint_location', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sla_capacity', full_name='context.Constraint.sla_capacity', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sla_latency', full_name='context.Constraint.sla_latency', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sla_availability', full_name='context.Constraint.sla_availability', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -2067,9 +2722,14 @@ _CONSTRAINT = _descriptor.Descriptor(
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
-  ],
-  serialized_start=4062,
-  serialized_end=4125,
+    _descriptor.OneofDescriptor(
+      name='constraint', full_name='context.Constraint.constraint',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=5488,
+  serialized_end=5857,
 )
 
 
@@ -2114,8 +2774,8 @@ _TERAFLOWCONTROLLER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4127,
-  serialized_end=4221,
+  serialized_start=5859,
+  serialized_end=5953,
 )
 
 
@@ -2153,8 +2813,8 @@ _AUTHENTICATIONRESULT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4223,
-  serialized_end=4308,
+  serialized_start=5955,
+  serialized_end=6040,
 )
 
 _EVENT.fields_by_name['event_type'].enum_type = _EVENTTYPEENUM
@@ -2222,10 +2882,15 @@ _SLICELIST.fields_by_name['slices'].message_type = _SLICE
 _SLICEEVENT.fields_by_name['event'].message_type = _EVENT
 _SLICEEVENT.fields_by_name['slice_id'].message_type = _SLICEID
 _CONNECTIONID.fields_by_name['connection_uuid'].message_type = _UUID
+_CONNECTIONSETTINGS.fields_by_name['l0'].message_type = _CONNECTIONSETTINGS_L0
+_CONNECTIONSETTINGS.fields_by_name['l2'].message_type = _CONNECTIONSETTINGS_L2
+_CONNECTIONSETTINGS.fields_by_name['l3'].message_type = _CONNECTIONSETTINGS_L3
+_CONNECTIONSETTINGS.fields_by_name['l4'].message_type = _CONNECTIONSETTINGS_L4
 _CONNECTION.fields_by_name['connection_id'].message_type = _CONNECTIONID
 _CONNECTION.fields_by_name['service_id'].message_type = _SERVICEID
 _CONNECTION.fields_by_name['path_hops_endpoint_ids'].message_type = _ENDPOINTID
 _CONNECTION.fields_by_name['sub_service_ids'].message_type = _SERVICEID
+_CONNECTION.fields_by_name['settings'].message_type = _CONNECTIONSETTINGS
 _CONNECTIONIDLIST.fields_by_name['connection_ids'].message_type = _CONNECTIONID
 _CONNECTIONLIST.fields_by_name['connections'].message_type = _CONNECTION
 _CONNECTIONEVENT.fields_by_name['event'].message_type = _EVENT
@@ -2235,7 +2900,49 @@ _ENDPOINTID.fields_by_name['device_id'].message_type = _DEVICEID
 _ENDPOINTID.fields_by_name['endpoint_uuid'].message_type = _UUID
 _ENDPOINT.fields_by_name['endpoint_id'].message_type = _ENDPOINTID
 _ENDPOINT.fields_by_name['kpi_sample_types'].enum_type = kpi__sample__types__pb2._KPISAMPLETYPE
+_CONFIGRULE_ACL.fields_by_name['endpoint_id'].message_type = _ENDPOINTID
+_CONFIGRULE_ACL.fields_by_name['rule_set'].message_type = acl__pb2._ACLRULESET
 _CONFIGRULE.fields_by_name['action'].enum_type = _CONFIGACTIONENUM
+_CONFIGRULE.fields_by_name['custom'].message_type = _CONFIGRULE_CUSTOM
+_CONFIGRULE.fields_by_name['acl'].message_type = _CONFIGRULE_ACL
+_CONFIGRULE.oneofs_by_name['config_rule'].fields.append(
+  _CONFIGRULE.fields_by_name['custom'])
+_CONFIGRULE.fields_by_name['custom'].containing_oneof = _CONFIGRULE.oneofs_by_name['config_rule']
+_CONFIGRULE.oneofs_by_name['config_rule'].fields.append(
+  _CONFIGRULE.fields_by_name['acl'])
+_CONFIGRULE.fields_by_name['acl'].containing_oneof = _CONFIGRULE.oneofs_by_name['config_rule']
+_CONSTRAINT_ENDPOINTLOCATION.fields_by_name['endpoint_id'].message_type = _ENDPOINTID
+_CONSTRAINT_ENDPOINTLOCATION.fields_by_name['gps_position'].message_type = _GPS_POSITION
+_CONSTRAINT_ENDPOINTLOCATION.oneofs_by_name['location'].fields.append(
+  _CONSTRAINT_ENDPOINTLOCATION.fields_by_name['region'])
+_CONSTRAINT_ENDPOINTLOCATION.fields_by_name['region'].containing_oneof = _CONSTRAINT_ENDPOINTLOCATION.oneofs_by_name['location']
+_CONSTRAINT_ENDPOINTLOCATION.oneofs_by_name['location'].fields.append(
+  _CONSTRAINT_ENDPOINTLOCATION.fields_by_name['gps_position'])
+_CONSTRAINT_ENDPOINTLOCATION.fields_by_name['gps_position'].containing_oneof = _CONSTRAINT_ENDPOINTLOCATION.oneofs_by_name['location']
+_CONSTRAINT.fields_by_name['custom'].message_type = _CONSTRAINT_CUSTOM
+_CONSTRAINT.fields_by_name['schedule'].message_type = _CONSTRAINT_SCHEDULE
+_CONSTRAINT.fields_by_name['endpoint_location'].message_type = _CONSTRAINT_ENDPOINTLOCATION
+_CONSTRAINT.fields_by_name['sla_capacity'].message_type = _CONSTRAINT_SLA_CAPACITY
+_CONSTRAINT.fields_by_name['sla_latency'].message_type = _CONSTRAINT_SLA_LATENCY
+_CONSTRAINT.fields_by_name['sla_availability'].message_type = _CONSTRAINT_SLA_AVAILABILITY
+_CONSTRAINT.oneofs_by_name['constraint'].fields.append(
+  _CONSTRAINT.fields_by_name['custom'])
+_CONSTRAINT.fields_by_name['custom'].containing_oneof = _CONSTRAINT.oneofs_by_name['constraint']
+_CONSTRAINT.oneofs_by_name['constraint'].fields.append(
+  _CONSTRAINT.fields_by_name['schedule'])
+_CONSTRAINT.fields_by_name['schedule'].containing_oneof = _CONSTRAINT.oneofs_by_name['constraint']
+_CONSTRAINT.oneofs_by_name['constraint'].fields.append(
+  _CONSTRAINT.fields_by_name['endpoint_location'])
+_CONSTRAINT.fields_by_name['endpoint_location'].containing_oneof = _CONSTRAINT.oneofs_by_name['constraint']
+_CONSTRAINT.oneofs_by_name['constraint'].fields.append(
+  _CONSTRAINT.fields_by_name['sla_capacity'])
+_CONSTRAINT.fields_by_name['sla_capacity'].containing_oneof = _CONSTRAINT.oneofs_by_name['constraint']
+_CONSTRAINT.oneofs_by_name['constraint'].fields.append(
+  _CONSTRAINT.fields_by_name['sla_latency'])
+_CONSTRAINT.fields_by_name['sla_latency'].containing_oneof = _CONSTRAINT.oneofs_by_name['constraint']
+_CONSTRAINT.oneofs_by_name['constraint'].fields.append(
+  _CONSTRAINT.fields_by_name['sla_availability'])
+_CONSTRAINT.fields_by_name['sla_availability'].containing_oneof = _CONSTRAINT.oneofs_by_name['constraint']
 _TERAFLOWCONTROLLER.fields_by_name['context_id'].message_type = _CONTEXTID
 _AUTHENTICATIONRESULT.fields_by_name['context_id'].message_type = _CONTEXTID
 DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY
@@ -2276,13 +2983,27 @@ DESCRIPTOR.message_types_by_name['SliceIdList'] = _SLICEIDLIST
 DESCRIPTOR.message_types_by_name['SliceList'] = _SLICELIST
 DESCRIPTOR.message_types_by_name['SliceEvent'] = _SLICEEVENT
 DESCRIPTOR.message_types_by_name['ConnectionId'] = _CONNECTIONID
+DESCRIPTOR.message_types_by_name['ConnectionSettings_L0'] = _CONNECTIONSETTINGS_L0
+DESCRIPTOR.message_types_by_name['ConnectionSettings_L2'] = _CONNECTIONSETTINGS_L2
+DESCRIPTOR.message_types_by_name['ConnectionSettings_L3'] = _CONNECTIONSETTINGS_L3
+DESCRIPTOR.message_types_by_name['ConnectionSettings_L4'] = _CONNECTIONSETTINGS_L4
+DESCRIPTOR.message_types_by_name['ConnectionSettings'] = _CONNECTIONSETTINGS
 DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION
 DESCRIPTOR.message_types_by_name['ConnectionIdList'] = _CONNECTIONIDLIST
 DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST
 DESCRIPTOR.message_types_by_name['ConnectionEvent'] = _CONNECTIONEVENT
 DESCRIPTOR.message_types_by_name['EndPointId'] = _ENDPOINTID
 DESCRIPTOR.message_types_by_name['EndPoint'] = _ENDPOINT
+DESCRIPTOR.message_types_by_name['ConfigRule_Custom'] = _CONFIGRULE_CUSTOM
+DESCRIPTOR.message_types_by_name['ConfigRule_ACL'] = _CONFIGRULE_ACL
 DESCRIPTOR.message_types_by_name['ConfigRule'] = _CONFIGRULE
+DESCRIPTOR.message_types_by_name['Constraint_Custom'] = _CONSTRAINT_CUSTOM
+DESCRIPTOR.message_types_by_name['Constraint_Schedule'] = _CONSTRAINT_SCHEDULE
+DESCRIPTOR.message_types_by_name['GPS_Position'] = _GPS_POSITION
+DESCRIPTOR.message_types_by_name['Constraint_EndPointLocation'] = _CONSTRAINT_ENDPOINTLOCATION
+DESCRIPTOR.message_types_by_name['Constraint_SLA_Latency'] = _CONSTRAINT_SLA_LATENCY
+DESCRIPTOR.message_types_by_name['Constraint_SLA_Capacity'] = _CONSTRAINT_SLA_CAPACITY
+DESCRIPTOR.message_types_by_name['Constraint_SLA_Availability'] = _CONSTRAINT_SLA_AVAILABILITY
 DESCRIPTOR.message_types_by_name['Constraint'] = _CONSTRAINT
 DESCRIPTOR.message_types_by_name['TeraFlowController'] = _TERAFLOWCONTROLLER
 DESCRIPTOR.message_types_by_name['AuthenticationResult'] = _AUTHENTICATIONRESULT
@@ -2561,6 +3282,41 @@ ConnectionId = _reflection.GeneratedProtocolMessageType('ConnectionId', (_messag
   })
 _sym_db.RegisterMessage(ConnectionId)
 
+ConnectionSettings_L0 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L0', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONSETTINGS_L0,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L0)
+  })
+_sym_db.RegisterMessage(ConnectionSettings_L0)
+
+ConnectionSettings_L2 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L2', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONSETTINGS_L2,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L2)
+  })
+_sym_db.RegisterMessage(ConnectionSettings_L2)
+
+ConnectionSettings_L3 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L3', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONSETTINGS_L3,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L3)
+  })
+_sym_db.RegisterMessage(ConnectionSettings_L3)
+
+ConnectionSettings_L4 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L4', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONSETTINGS_L4,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L4)
+  })
+_sym_db.RegisterMessage(ConnectionSettings_L4)
+
+ConnectionSettings = _reflection.GeneratedProtocolMessageType('ConnectionSettings', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONSETTINGS,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionSettings)
+  })
+_sym_db.RegisterMessage(ConnectionSettings)
+
 Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), {
   'DESCRIPTOR' : _CONNECTION,
   '__module__' : 'context_pb2'
@@ -2603,6 +3359,20 @@ EndPoint = _reflection.GeneratedProtocolMessageType('EndPoint', (_message.Messag
   })
 _sym_db.RegisterMessage(EndPoint)
 
+ConfigRule_Custom = _reflection.GeneratedProtocolMessageType('ConfigRule_Custom', (_message.Message,), {
+  'DESCRIPTOR' : _CONFIGRULE_CUSTOM,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConfigRule_Custom)
+  })
+_sym_db.RegisterMessage(ConfigRule_Custom)
+
+ConfigRule_ACL = _reflection.GeneratedProtocolMessageType('ConfigRule_ACL', (_message.Message,), {
+  'DESCRIPTOR' : _CONFIGRULE_ACL,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConfigRule_ACL)
+  })
+_sym_db.RegisterMessage(ConfigRule_ACL)
+
 ConfigRule = _reflection.GeneratedProtocolMessageType('ConfigRule', (_message.Message,), {
   'DESCRIPTOR' : _CONFIGRULE,
   '__module__' : 'context_pb2'
@@ -2610,6 +3380,55 @@ ConfigRule = _reflection.GeneratedProtocolMessageType('ConfigRule', (_message.Me
   })
 _sym_db.RegisterMessage(ConfigRule)
 
+Constraint_Custom = _reflection.GeneratedProtocolMessageType('Constraint_Custom', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT_CUSTOM,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint_Custom)
+  })
+_sym_db.RegisterMessage(Constraint_Custom)
+
+Constraint_Schedule = _reflection.GeneratedProtocolMessageType('Constraint_Schedule', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT_SCHEDULE,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint_Schedule)
+  })
+_sym_db.RegisterMessage(Constraint_Schedule)
+
+GPS_Position = _reflection.GeneratedProtocolMessageType('GPS_Position', (_message.Message,), {
+  'DESCRIPTOR' : _GPS_POSITION,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.GPS_Position)
+  })
+_sym_db.RegisterMessage(GPS_Position)
+
+Constraint_EndPointLocation = _reflection.GeneratedProtocolMessageType('Constraint_EndPointLocation', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT_ENDPOINTLOCATION,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint_EndPointLocation)
+  })
+_sym_db.RegisterMessage(Constraint_EndPointLocation)
+
+Constraint_SLA_Latency = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Latency', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT_SLA_LATENCY,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Latency)
+  })
+_sym_db.RegisterMessage(Constraint_SLA_Latency)
+
+Constraint_SLA_Capacity = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Capacity', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT_SLA_CAPACITY,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Capacity)
+  })
+_sym_db.RegisterMessage(Constraint_SLA_Capacity)
+
+Constraint_SLA_Availability = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Availability', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT_SLA_AVAILABILITY,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Availability)
+  })
+_sym_db.RegisterMessage(Constraint_SLA_Availability)
+
 Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), {
   'DESCRIPTOR' : _CONSTRAINT,
   '__module__' : 'context_pb2'
@@ -2640,8 +3459,8 @@ _CONTEXTSERVICE = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=5273,
-  serialized_end=7688,
+  serialized_start=7005,
+  serialized_end=9420,
   methods=[
   _descriptor.MethodDescriptor(
     name='ListContextIds',
diff --git a/src/context/proto/context_policy_pb2.py b/src/context/proto/context_policy_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e9d6d15fd1b47e02b580f9e17247ed1a8a87616
--- /dev/null
+++ b/src/context/proto/context_policy_pb2.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: context-policy.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from . import context_pb2 as context__pb2
+from . import policy_pb2 as policy__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='context-policy.proto',
+  package='context_policy',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x14\x63ontext-policy.proto\x12\x0e\x63ontext_policy\x1a\rcontext.proto\x1a\x0cpolicy.proto2\xca\x02\n\x14\x43ontextPolicyService\x12?\n\x11ListPolicyRuleIds\x12\x0e.context.Empty\x1a\x18.policy.PolicyRuleIdList\"\x00\x12;\n\x0fListPolicyRules\x12\x0e.context.Empty\x1a\x16.policy.PolicyRuleList\"\x00\x12;\n\rGetPolicyRule\x12\x14.policy.PolicyRuleId\x1a\x12.policy.PolicyRule\"\x00\x12;\n\rSetPolicyRule\x12\x12.policy.PolicyRule\x1a\x14.policy.PolicyRuleId\"\x00\x12:\n\x10RemovePolicyRule\x12\x14.policy.PolicyRuleId\x1a\x0e.context.Empty\"\x00\x62\x06proto3'
+  ,
+  dependencies=[context__pb2.DESCRIPTOR,policy__pb2.DESCRIPTOR,])
+
+
+
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+
+_CONTEXTPOLICYSERVICE = _descriptor.ServiceDescriptor(
+  name='ContextPolicyService',
+  full_name='context_policy.ContextPolicyService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=70,
+  serialized_end=400,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='ListPolicyRuleIds',
+    full_name='context_policy.ContextPolicyService.ListPolicyRuleIds',
+    index=0,
+    containing_service=None,
+    input_type=context__pb2._EMPTY,
+    output_type=policy__pb2._POLICYRULEIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListPolicyRules',
+    full_name='context_policy.ContextPolicyService.ListPolicyRules',
+    index=1,
+    containing_service=None,
+    input_type=context__pb2._EMPTY,
+    output_type=policy__pb2._POLICYRULELIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPolicyRule',
+    full_name='context_policy.ContextPolicyService.GetPolicyRule',
+    index=2,
+    containing_service=None,
+    input_type=policy__pb2._POLICYRULEID,
+    output_type=policy__pb2._POLICYRULE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetPolicyRule',
+    full_name='context_policy.ContextPolicyService.SetPolicyRule',
+    index=3,
+    containing_service=None,
+    input_type=policy__pb2._POLICYRULE,
+    output_type=policy__pb2._POLICYRULEID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemovePolicyRule',
+    full_name='context_policy.ContextPolicyService.RemovePolicyRule',
+    index=4,
+    containing_service=None,
+    input_type=policy__pb2._POLICYRULEID,
+    output_type=context__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CONTEXTPOLICYSERVICE)
+
+DESCRIPTOR.services_by_name['ContextPolicyService'] = _CONTEXTPOLICYSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/src/context/proto/context_policy_pb2_grpc.py b/src/context/proto/context_policy_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a9a1356170949a4c0cd7220956e68b2f57b33fb
--- /dev/null
+++ b/src/context/proto/context_policy_pb2_grpc.py
@@ -0,0 +1,199 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from . import context_pb2 as context__pb2
+from . import policy_pb2 as policy__pb2
+
+
+class ContextPolicyServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ListPolicyRuleIds = channel.unary_unary(
+                '/context_policy.ContextPolicyService/ListPolicyRuleIds',
+                request_serializer=context__pb2.Empty.SerializeToString,
+                response_deserializer=policy__pb2.PolicyRuleIdList.FromString,
+                )
+        self.ListPolicyRules = channel.unary_unary(
+                '/context_policy.ContextPolicyService/ListPolicyRules',
+                request_serializer=context__pb2.Empty.SerializeToString,
+                response_deserializer=policy__pb2.PolicyRuleList.FromString,
+                )
+        self.GetPolicyRule = channel.unary_unary(
+                '/context_policy.ContextPolicyService/GetPolicyRule',
+                request_serializer=policy__pb2.PolicyRuleId.SerializeToString,
+                response_deserializer=policy__pb2.PolicyRule.FromString,
+                )
+        self.SetPolicyRule = channel.unary_unary(
+                '/context_policy.ContextPolicyService/SetPolicyRule',
+                request_serializer=policy__pb2.PolicyRule.SerializeToString,
+                response_deserializer=policy__pb2.PolicyRuleId.FromString,
+                )
+        self.RemovePolicyRule = channel.unary_unary(
+                '/context_policy.ContextPolicyService/RemovePolicyRule',
+                request_serializer=policy__pb2.PolicyRuleId.SerializeToString,
+                response_deserializer=context__pb2.Empty.FromString,
+                )
+
+
+class ContextPolicyServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def ListPolicyRuleIds(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListPolicyRules(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetPolicyRule(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SetPolicyRule(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RemovePolicyRule(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ContextPolicyServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'ListPolicyRuleIds': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListPolicyRuleIds,
+                    request_deserializer=context__pb2.Empty.FromString,
+                    response_serializer=policy__pb2.PolicyRuleIdList.SerializeToString,
+            ),
+            'ListPolicyRules': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListPolicyRules,
+                    request_deserializer=context__pb2.Empty.FromString,
+                    response_serializer=policy__pb2.PolicyRuleList.SerializeToString,
+            ),
+            'GetPolicyRule': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetPolicyRule,
+                    request_deserializer=policy__pb2.PolicyRuleId.FromString,
+                    response_serializer=policy__pb2.PolicyRule.SerializeToString,
+            ),
+            'SetPolicyRule': grpc.unary_unary_rpc_method_handler(
+                    servicer.SetPolicyRule,
+                    request_deserializer=policy__pb2.PolicyRule.FromString,
+                    response_serializer=policy__pb2.PolicyRuleId.SerializeToString,
+            ),
+            'RemovePolicyRule': grpc.unary_unary_rpc_method_handler(
+                    servicer.RemovePolicyRule,
+                    request_deserializer=policy__pb2.PolicyRuleId.FromString,
+                    response_serializer=context__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'context_policy.ContextPolicyService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ContextPolicyService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def ListPolicyRuleIds(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/context_policy.ContextPolicyService/ListPolicyRuleIds',
+            context__pb2.Empty.SerializeToString,
+            policy__pb2.PolicyRuleIdList.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListPolicyRules(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/context_policy.ContextPolicyService/ListPolicyRules',
+            context__pb2.Empty.SerializeToString,
+            policy__pb2.PolicyRuleList.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetPolicyRule(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/context_policy.ContextPolicyService/GetPolicyRule',
+            policy__pb2.PolicyRuleId.SerializeToString,
+            policy__pb2.PolicyRule.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SetPolicyRule(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/context_policy.ContextPolicyService/SetPolicyRule',
+            policy__pb2.PolicyRule.SerializeToString,
+            policy__pb2.PolicyRuleId.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RemovePolicyRule(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/context_policy.ContextPolicyService/RemovePolicyRule',
+            policy__pb2.PolicyRuleId.SerializeToString,
+            context__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/src/context/proto/policy_pb2.py b/src/context/proto/policy_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..7645a4c0931d8ea66fe03ecd89bec64e98622fed
--- /dev/null
+++ b/src/context/proto/policy_pb2.py
@@ -0,0 +1,492 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: policy.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from . import context_pb2 as context__pb2
+from . import policy_condition_pb2 as policy__condition__pb2
+from . import policy_action_pb2 as policy__action__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='policy.proto',
+  package='policy',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x0cpolicy.proto\x12\x06policy\x1a\rcontext.proto\x1a\x16policy-condition.proto\x1a\x13policy-action.proto\"+\n\x0cPolicyRuleId\x12\x1b\n\x04uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"b\n\x0fPolicyRuleState\x12#\n\x0cpolicyRuleId\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12*\n\x0fpolicyRuleState\x18\x02 \x01(\x0e\x32\x11.policy.RuleState\"0\n\x0fPolicyRuleEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\"\x84\x03\n\nPolicyRule\x12*\n\x0cpolicyRuleId\x18\x01 \x01(\x0b\x32\x14.policy.PolicyRuleId\x12.\n\x0epolicyRuleType\x18\x02 \x01(\x0e\x32\x16.policy.PolicyRuleType\x12\x10\n\x08priority\x18\x03 \x01(\r\x12&\n\x05\x65vent\x18\x04 \x01(\x0b\x32\x17.policy.PolicyRuleEvent\x12\x32\n\rconditionList\x18\x05 \x03(\x0b\x32\x1b.policy.PolicyRuleCondition\x12\x30\n\x0f\x62ooleanOperator\x18\x06 \x01(\x0e\x32\x17.policy.BooleanOperator\x12,\n\nactionList\x18\x07 \x03(\x0b\x32\x18.policy.PolicyRuleAction\x12%\n\tserviceId\x18\x08 \x01(\x0b\x32\x12.context.ServiceId\x12%\n\ndeviceList\x18\t \x03(\x0b\x32\x11.context.DeviceId\"<\n\x0ePolicyRuleList\x12*\n\x0epolicyRuleList\x18\x01 \x03(\x0b\x32\x12.policy.PolicyRule\"?\n\x10PolicyRuleIdList\x12+\n\rpolicyRuleIds\x18\x01 \x03(\x0b\x32\x14.policy.PolicyRuleId*G\n\tRuleState\x12\x13\n\x0fPOLICY_INACTIVE\x10\x00\x12\x12\n\x0ePOLICY_PLANNED\x10\x01\x12\x11\n\rPOLICY_ACTIVE\x10\x02*?\n\x0ePolicyRuleType\x12\x15\n\x11POLICYTYPE_DEVICE\x10\x00\x12\x16\n\x12POLICYTYPE_NETWORK\x10\x01\x32\x8c\x03\n\rPolicyService\x12:\n\tPolicyAdd\x12\x12.policy.PolicyRule\x1a\x17.policy.PolicyRuleState\"\x00\x12=\n\x0cPolicyUpdate\x12\x12.policy.PolicyRule\x1a\x17.policy.PolicyRuleState\"\x00\x12=\n\x0cPolicyDelete\x12\x12.policy.PolicyRule\x1a\x17.policy.PolicyRuleState\"\x00\x12\x37\n\tGetPolicy\x12\x14.policy.PolicyRuleId\x1a\x12.policy.PolicyRule\"\x00\x12\x42\n\x13GetPolicyByDeviceId\x12\x11.context.DeviceId\x1a\x16.policy.PolicyRuleList\"\x00\x12\x44\n\x14GetPolicyByServiceId\x12\x12.context.ServiceId\x1a\x16.policy.PolicyRuleList\"\x00\x62\x06proto3'
+  ,
+  dependencies=[context__pb2.DESCRIPTOR,policy__condition__pb2.DESCRIPTOR,policy__action__pb2.DESCRIPTOR,])
+
+_RULESTATE = _descriptor.EnumDescriptor(
+  name='RuleState',
+  full_name='policy.RuleState',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='POLICY_INACTIVE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='POLICY_PLANNED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='POLICY_ACTIVE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=797,
+  serialized_end=868,
+)
+_sym_db.RegisterEnumDescriptor(_RULESTATE)
+
+RuleState = enum_type_wrapper.EnumTypeWrapper(_RULESTATE)
+_POLICYRULETYPE = _descriptor.EnumDescriptor(
+  name='PolicyRuleType',
+  full_name='policy.PolicyRuleType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='POLICYTYPE_DEVICE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='POLICYTYPE_NETWORK', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=870,
+  serialized_end=933,
+)
+_sym_db.RegisterEnumDescriptor(_POLICYRULETYPE)
+
+PolicyRuleType = enum_type_wrapper.EnumTypeWrapper(_POLICYRULETYPE)
+POLICY_INACTIVE = 0
+POLICY_PLANNED = 1
+POLICY_ACTIVE = 2
+POLICYTYPE_DEVICE = 0
+POLICYTYPE_NETWORK = 1
+
+
+
+_POLICYRULEID = _descriptor.Descriptor(
+  name='PolicyRuleId',
+  full_name='policy.PolicyRuleId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='uuid', full_name='policy.PolicyRuleId.uuid', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=84,
+  serialized_end=127,
+)
+
+
+_POLICYRULESTATE = _descriptor.Descriptor(
+  name='PolicyRuleState',
+  full_name='policy.PolicyRuleState',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='policyRuleId', full_name='policy.PolicyRuleState.policyRuleId', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='policyRuleState', full_name='policy.PolicyRuleState.policyRuleState', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=129,
+  serialized_end=227,
+)
+
+
+_POLICYRULEEVENT = _descriptor.Descriptor(
+  name='PolicyRuleEvent',
+  full_name='policy.PolicyRuleEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='policy.PolicyRuleEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=229,
+  serialized_end=277,
+)
+
+
+_POLICYRULE = _descriptor.Descriptor(
+  name='PolicyRule',
+  full_name='policy.PolicyRule',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='policyRuleId', full_name='policy.PolicyRule.policyRuleId', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='policyRuleType', full_name='policy.PolicyRule.policyRuleType', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='priority', full_name='policy.PolicyRule.priority', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event', full_name='policy.PolicyRule.event', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='conditionList', full_name='policy.PolicyRule.conditionList', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='booleanOperator', full_name='policy.PolicyRule.booleanOperator', index=5,
+      number=6, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='actionList', full_name='policy.PolicyRule.actionList', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='serviceId', full_name='policy.PolicyRule.serviceId', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='deviceList', full_name='policy.PolicyRule.deviceList', index=8,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=280,
+  serialized_end=668,
+)
+
+
+_POLICYRULELIST = _descriptor.Descriptor(
+  name='PolicyRuleList',
+  full_name='policy.PolicyRuleList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='policyRuleList', full_name='policy.PolicyRuleList.policyRuleList', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=670,
+  serialized_end=730,
+)
+
+
+_POLICYRULEIDLIST = _descriptor.Descriptor(
+  name='PolicyRuleIdList',
+  full_name='policy.PolicyRuleIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='policyRuleIds', full_name='policy.PolicyRuleIdList.policyRuleIds', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=732,
+  serialized_end=795,
+)
+
+_POLICYRULEID.fields_by_name['uuid'].message_type = context__pb2._UUID
+_POLICYRULESTATE.fields_by_name['policyRuleId'].message_type = context__pb2._UUID
+_POLICYRULESTATE.fields_by_name['policyRuleState'].enum_type = _RULESTATE
+_POLICYRULEEVENT.fields_by_name['event'].message_type = context__pb2._EVENT
+_POLICYRULE.fields_by_name['policyRuleId'].message_type = _POLICYRULEID
+_POLICYRULE.fields_by_name['policyRuleType'].enum_type = _POLICYRULETYPE
+_POLICYRULE.fields_by_name['event'].message_type = _POLICYRULEEVENT
+_POLICYRULE.fields_by_name['conditionList'].message_type = policy__condition__pb2._POLICYRULECONDITION
+_POLICYRULE.fields_by_name['booleanOperator'].enum_type = policy__condition__pb2._BOOLEANOPERATOR
+_POLICYRULE.fields_by_name['actionList'].message_type = policy__action__pb2._POLICYRULEACTION
+_POLICYRULE.fields_by_name['serviceId'].message_type = context__pb2._SERVICEID
+_POLICYRULE.fields_by_name['deviceList'].message_type = context__pb2._DEVICEID
+_POLICYRULELIST.fields_by_name['policyRuleList'].message_type = _POLICYRULE
+_POLICYRULEIDLIST.fields_by_name['policyRuleIds'].message_type = _POLICYRULEID
+DESCRIPTOR.message_types_by_name['PolicyRuleId'] = _POLICYRULEID
+DESCRIPTOR.message_types_by_name['PolicyRuleState'] = _POLICYRULESTATE
+DESCRIPTOR.message_types_by_name['PolicyRuleEvent'] = _POLICYRULEEVENT
+DESCRIPTOR.message_types_by_name['PolicyRule'] = _POLICYRULE
+DESCRIPTOR.message_types_by_name['PolicyRuleList'] = _POLICYRULELIST
+DESCRIPTOR.message_types_by_name['PolicyRuleIdList'] = _POLICYRULEIDLIST
+DESCRIPTOR.enum_types_by_name['RuleState'] = _RULESTATE
+DESCRIPTOR.enum_types_by_name['PolicyRuleType'] = _POLICYRULETYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+PolicyRuleId = _reflection.GeneratedProtocolMessageType('PolicyRuleId', (_message.Message,), {
+  'DESCRIPTOR' : _POLICYRULEID,
+  '__module__' : 'policy_pb2'
+  # @@protoc_insertion_point(class_scope:policy.PolicyRuleId)
+  })
+_sym_db.RegisterMessage(PolicyRuleId)
+
+PolicyRuleState = _reflection.GeneratedProtocolMessageType('PolicyRuleState', (_message.Message,), {
+  'DESCRIPTOR' : _POLICYRULESTATE,
+  '__module__' : 'policy_pb2'
+  # @@protoc_insertion_point(class_scope:policy.PolicyRuleState)
+  })
+_sym_db.RegisterMessage(PolicyRuleState)
+
+PolicyRuleEvent = _reflection.GeneratedProtocolMessageType('PolicyRuleEvent', (_message.Message,), {
+  'DESCRIPTOR' : _POLICYRULEEVENT,
+  '__module__' : 'policy_pb2'
+  # @@protoc_insertion_point(class_scope:policy.PolicyRuleEvent)
+  })
+_sym_db.RegisterMessage(PolicyRuleEvent)
+
+PolicyRule = _reflection.GeneratedProtocolMessageType('PolicyRule', (_message.Message,), {
+  'DESCRIPTOR' : _POLICYRULE,
+  '__module__' : 'policy_pb2'
+  # @@protoc_insertion_point(class_scope:policy.PolicyRule)
+  })
+_sym_db.RegisterMessage(PolicyRule)
+
+PolicyRuleList = _reflection.GeneratedProtocolMessageType('PolicyRuleList', (_message.Message,), {
+  'DESCRIPTOR' : _POLICYRULELIST,
+  '__module__' : 'policy_pb2'
+  # @@protoc_insertion_point(class_scope:policy.PolicyRuleList)
+  })
+_sym_db.RegisterMessage(PolicyRuleList)
+
+PolicyRuleIdList = _reflection.GeneratedProtocolMessageType('PolicyRuleIdList', (_message.Message,), {
+  'DESCRIPTOR' : _POLICYRULEIDLIST,
+  '__module__' : 'policy_pb2'
+  # @@protoc_insertion_point(class_scope:policy.PolicyRuleIdList)
+  })
+_sym_db.RegisterMessage(PolicyRuleIdList)
+
+
+
+_POLICYSERVICE = _descriptor.ServiceDescriptor(
+  name='PolicyService',
+  full_name='policy.PolicyService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=936,
+  serialized_end=1332,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='PolicyAdd',
+    full_name='policy.PolicyService.PolicyAdd',
+    index=0,
+    containing_service=None,
+    input_type=_POLICYRULE,
+    output_type=_POLICYRULESTATE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='PolicyUpdate',
+    full_name='policy.PolicyService.PolicyUpdate',
+    index=1,
+    containing_service=None,
+    input_type=_POLICYRULE,
+    output_type=_POLICYRULESTATE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='PolicyDelete',
+    full_name='policy.PolicyService.PolicyDelete',
+    index=2,
+    containing_service=None,
+    input_type=_POLICYRULE,
+    output_type=_POLICYRULESTATE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPolicy',
+    full_name='policy.PolicyService.GetPolicy',
+    index=3,
+    containing_service=None,
+    input_type=_POLICYRULEID,
+    output_type=_POLICYRULE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPolicyByDeviceId',
+    full_name='policy.PolicyService.GetPolicyByDeviceId',
+    index=4,
+    containing_service=None,
+    input_type=context__pb2._DEVICEID,
+    output_type=_POLICYRULELIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPolicyByServiceId',
+    full_name='policy.PolicyService.GetPolicyByServiceId',
+    index=5,
+    containing_service=None,
+    input_type=context__pb2._SERVICEID,
+    output_type=_POLICYRULELIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_POLICYSERVICE)
+
+DESCRIPTOR.services_by_name['PolicyService'] = _POLICYSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py
index b282178989fa3f357a77fd6a1aa8fb6900fd430d..dd41096ec25fb74f1b1b855c98f90e09fee33194 100644
--- a/src/device/service/drivers/openconfig/OpenConfigDriver.py
+++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py
@@ -30,7 +30,6 @@ from device.service.driver_api.AnyTreeTools import TreeNode, get_subnode, set_su
 from .templates import ALL_RESOURCE_KEYS, EMPTY_CONFIG, compose_config, get_filter, parse
 from .RetryDecorator import retry
 
-
 DEBUG_MODE = False
 logging.getLogger('ncclient.manager').setLevel(logging.DEBUG if DEBUG_MODE else logging.WARNING)
 logging.getLogger('ncclient.transport.ssh').setLevel(logging.DEBUG if DEBUG_MODE else logging.WARNING)
diff --git a/src/pathcomp/.gitlab-ci.yml b/src/pathcomp/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..56674d223afdc12a830a4542d92ee730e2bb971b
--- /dev/null
+++ b/src/pathcomp/.gitlab-ci.yml
@@ -0,0 +1,102 @@
+# 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.
+
+# Build, tag and push the Docker image to the GitLab registry
+build pathcomp:
+  variables:
+    IMAGE_NAME: 'pathcomp' # name of the microservice
+    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+  stage: build
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+  script:
+    - docker build -t "$IMAGE_NAME:$IMAGE_TAG" -f ./src/$IMAGE_NAME/Dockerfile ./src/
+    - docker tag "$IMAGE_NAME:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
+    - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
+  after_script:
+    - docker images --filter="dangling=true" --quiet | xargs -r docker rmi
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' 
+    - changes:
+      - src/$IMAGE_NAME/**/*.{py,in,yml}
+      - src/$IMAGE_NAME/Dockerfile
+      - src/$IMAGE_NAME/tests/*.py
+      - manifests/${IMAGE_NAME}service.yaml
+      - .gitlab-ci.yml
+
+# Apply unit test to the component
+unit test pathcomp:
+  variables:
+    IMAGE_NAME: 'pathcomp' # name of the microservice
+    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+  stage: unit_test
+  needs:
+    - build pathcomp
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+    - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi
+    - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME image is not in the system"; fi
+  script:
+    - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
+    - docker run --name $IMAGE_NAME -d -p 3030:3030 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
+    - sleep 5
+    - docker ps -a
+    - docker logs $IMAGE_NAME
+    - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
+    - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
+  coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
+  after_script:
+    - docker rm -f $IMAGE_NAME
+    - docker network rm teraflowbridge
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' 
+    - changes:
+      - src/$IMAGE_NAME/**/*.{py,in,yml}
+      - src/$IMAGE_NAME/Dockerfile
+      - src/$IMAGE_NAME/tests/*.py
+      - src/$IMAGE_NAME/tests/Dockerfile
+      - manifests/${IMAGE_NAME}service.yaml
+      - .gitlab-ci.yml
+  artifacts:
+      when: always
+      reports:
+        junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
+
+# Deployment of the service in Kubernetes Cluster
+deploy pathcomp:
+  variables:
+    IMAGE_NAME: 'pathcomp' # name of the microservice
+    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+  stage: deploy
+  needs:
+    - unit test pathcomp
+    # - integ_test execute
+  script:
+    - 'sed -i "s/$IMAGE_NAME:.*/$IMAGE_NAME:$IMAGE_TAG/" manifests/${IMAGE_NAME}service.yaml'
+    - kubectl version
+    - kubectl get all
+    - kubectl apply -f "manifests/${IMAGE_NAME}service.yaml"
+    - kubectl get all
+  # environment:
+  #   name: test
+  #   url: https://example.com
+  #   kubernetes:
+  #     namespace: test
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
+      when: manual    
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"'
+      when: manual
diff --git a/src/pathcomp/Config.py b/src/pathcomp/Config.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/pathcomp/Config.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/pathcomp/Dockerfile b/src/pathcomp/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..806d97bac6ae5439349506d2b8798111c43d0c0a
--- /dev/null
+++ b/src/pathcomp/Dockerfile
@@ -0,0 +1,50 @@
+# 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 python:3-slim
+
+# Install dependencies
+RUN apt-get --yes --quiet --quiet update && \
+    apt-get --yes --quiet --quiet install wget g++ && \
+    rm -rf /var/lib/apt/lists/*
+
+# Set Python to show logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# Download the gRPC health probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Get generic Python packages
+RUN python3 -m pip install --upgrade pip setuptools wheel pip-tools
+
+# Set working directory
+WORKDIR /var/teraflow
+
+# Create module sub-folders
+RUN mkdir -p /var/teraflow/pathcomp
+
+# Get Python packages per module
+COPY pathcomp/requirements.in pathcomp/requirements.in
+RUN pip-compile --output-file=pathcomp/requirements.txt pathcomp/requirements.in
+RUN python3 -m pip install -r pathcomp/requirements.txt
+
+# Add files into working directory
+COPY common/. common
+COPY context/. context
+COPY pathcomp/. pathcomp
+
+# Start service service
+ENTRYPOINT ["python", "-m", "pathcomp.service"]
diff --git a/src/pathcomp/__init__.py b/src/pathcomp/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/pathcomp/__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/pathcomp/client/PathCompClient.py b/src/pathcomp/client/PathCompClient.py
new file mode 100644
index 0000000000000000000000000000000000000000..b872ba1846ed7b1798ffbbb0d0be81fd73df2368
--- /dev/null
+++ b/src/pathcomp/client/PathCompClient.py
@@ -0,0 +1,53 @@
+# 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 grpc, logging
+from common.Constants import ServiceNameEnum
+from common.Settings import get_service_host, get_service_port_grpc
+from common.tools.client.RetryDecorator import retry, delay_exponential
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from pathcomp.proto.pathcomp_pb2 import PathCompReply, PathCompRequest
+from pathcomp.proto.pathcomp_pb2_grpc import PathCompServiceStub
+
+LOGGER = logging.getLogger(__name__)
+MAX_RETRIES = 15
+DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0)
+RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect')
+
+class PathCompClient:
+    def __init__(self, host=None, port=None):
+        if not host: host = get_service_host(ServiceNameEnum.PATHCOMP)
+        if not port: port = get_service_port_grpc(ServiceNameEnum.PATHCOMP)
+        self.endpoint = '{:s}:{:s}'.format(str(host), str(port))
+        LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint)))
+        self.channel = None
+        self.stub = None
+        self.connect()
+        LOGGER.debug('Channel created')
+
+    def connect(self):
+        self.channel = grpc.insecure_channel(self.endpoint)
+        self.stub = PathCompServiceStub(self.channel)
+
+    def close(self):
+        if self.channel is not None: self.channel.close()
+        self.channel = None
+        self.stub = None
+
+    @RETRY_DECORATOR
+    def Compute(self, request : PathCompRequest) -> PathCompReply:
+        LOGGER.debug('Compute request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.Compute(request)
+        LOGGER.debug('Compute result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
diff --git a/src/pathcomp/client/__init__.py b/src/pathcomp/client/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/pathcomp/client/__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/pathcomp/genproto.sh b/src/pathcomp/genproto.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8c6683626b6da4bb5f6050c0595818a945b2c3ab
--- /dev/null
+++ b/src/pathcomp/genproto.sh
@@ -0,0 +1,49 @@
+#!/bin/bash -eu
+#
+# 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 folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+rm -rf proto/*.py
+rm -rf proto/__pycache__
+tee proto/__init__.py << EOF > /dev/null
+# 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.
+
+EOF
+
+python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto context.proto
+python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto kpi_sample_types.proto
+python -m grpc_tools.protoc -I../../proto --python_out=proto --grpc_python_out=proto pathcomp.proto
+
+rm proto/context_pb2_grpc.py
+rm proto/kpi_sample_types_pb2_grpc.py
+
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/context_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/kpi_sample_types_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/pathcomp_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' proto/pathcomp_pb2_grpc.py
diff --git a/src/pathcomp/proto/__init__.py b/src/pathcomp/proto/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/pathcomp/proto/__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/pathcomp/proto/context_pb2.py b/src/pathcomp/proto/context_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..50d501d3ac053ad644554331af26e3c40cd426a1
--- /dev/null
+++ b/src/pathcomp/proto/context_pb2.py
@@ -0,0 +1,3071 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: context.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from . import kpi_sample_types_pb2 as kpi__sample__types__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='context.proto',
+  package='context',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\rcontext.proto\x12\x07\x63ontext\x1a\x16kpi_sample_types.proto\"\x07\n\x05\x45mpty\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"F\n\x05\x45vent\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\x12*\n\nevent_type\x18\x02 \x01(\x0e\x32\x16.context.EventTypeEnum\"0\n\tContextId\x12#\n\x0c\x63ontext_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xb6\x01\n\x07\x43ontext\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12)\n\x0ctopology_ids\x18\x02 \x03(\x0b\x32\x13.context.TopologyId\x12\'\n\x0bservice_ids\x18\x03 \x03(\x0b\x32\x12.context.ServiceId\x12/\n\ncontroller\x18\x04 \x01(\x0b\x32\x1b.context.TeraFlowController\"8\n\rContextIdList\x12\'\n\x0b\x63ontext_ids\x18\x01 \x03(\x0b\x32\x12.context.ContextId\"1\n\x0b\x43ontextList\x12\"\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x10.context.Context\"U\n\x0c\x43ontextEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\ncontext_id\x18\x02 \x01(\x0b\x32\x12.context.ContextId\"Z\n\nTopologyId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12$\n\rtopology_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"~\n\x08Topology\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12%\n\ndevice_ids\x18\x02 \x03(\x0b\x32\x11.context.DeviceId\x12!\n\x08link_ids\x18\x03 \x03(\x0b\x32\x0f.context.LinkId\";\n\x0eTopologyIdList\x12)\n\x0ctopology_ids\x18\x01 \x03(\x0b\x32\x13.context.TopologyId\"5\n\x0cTopologyList\x12%\n\ntopologies\x18\x01 \x03(\x0b\x32\x11.context.Topology\"X\n\rTopologyEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12(\n\x0btopology_id\x18\x02 \x01(\x0b\x32\x13.context.TopologyId\".\n\x08\x44\x65viceId\x12\"\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\x9a\x02\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x13\n\x0b\x64\x65vice_type\x18\x02 \x01(\t\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\x12G\n\x19\x64\x65vice_operational_status\x18\x04 \x01(\x0e\x32$.context.DeviceOperationalStatusEnum\x12\x31\n\x0e\x64\x65vice_drivers\x18\x05 \x03(\x0e\x32\x19.context.DeviceDriverEnum\x12+\n\x10\x64\x65vice_endpoints\x18\x06 \x03(\x0b\x32\x11.context.EndPoint\"9\n\x0c\x44\x65viceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"5\n\x0c\x44\x65viceIdList\x12%\n\ndevice_ids\x18\x01 \x03(\x0b\x32\x11.context.DeviceId\".\n\nDeviceList\x12 \n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\x0f.context.Device\"R\n\x0b\x44\x65viceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"*\n\x06LinkId\x12 \n\tlink_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"X\n\x04Link\x12 \n\x07link_id\x18\x01 \x01(\x0b\x32\x0f.context.LinkId\x12.\n\x11link_endpoint_ids\x18\x02 \x03(\x0b\x32\x13.context.EndPointId\"/\n\nLinkIdList\x12!\n\x08link_ids\x18\x01 \x03(\x0b\x32\x0f.context.LinkId\"(\n\x08LinkList\x12\x1c\n\x05links\x18\x01 \x03(\x0b\x32\r.context.Link\"L\n\tLinkEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12 \n\x07link_id\x18\x02 \x01(\x0b\x32\x0f.context.LinkId\"X\n\tServiceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12#\n\x0cservice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xa6\x02\n\x07Service\x12&\n\nservice_id\x18\x01 \x01(\x0b\x32\x12.context.ServiceId\x12.\n\x0cservice_type\x18\x02 \x01(\x0e\x32\x18.context.ServiceTypeEnum\x12\x31\n\x14service_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12\x30\n\x13service_constraints\x18\x04 \x03(\x0b\x32\x13.context.Constraint\x12.\n\x0eservice_status\x18\x05 \x01(\x0b\x32\x16.context.ServiceStatus\x12.\n\x0eservice_config\x18\x06 \x01(\x0b\x32\x16.context.ServiceConfig\"C\n\rServiceStatus\x12\x32\n\x0eservice_status\x18\x01 \x01(\x0e\x32\x1a.context.ServiceStatusEnum\":\n\rServiceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"8\n\rServiceIdList\x12\'\n\x0bservice_ids\x18\x01 \x03(\x0b\x32\x12.context.ServiceId\"1\n\x0bServiceList\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\"U\n\x0cServiceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\"T\n\x07SliceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12!\n\nslice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\x95\x02\n\x05Slice\x12\"\n\x08slice_id\x18\x01 \x01(\x0b\x32\x10.context.SliceId\x12/\n\x12slice_endpoint_ids\x18\x02 \x03(\x0b\x32\x13.context.EndPointId\x12.\n\x11slice_constraints\x18\x03 \x03(\x0b\x32\x13.context.Constraint\x12-\n\x11slice_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12,\n\x12slice_subslice_ids\x18\x05 \x03(\x0b\x32\x10.context.SliceId\x12*\n\x0cslice_status\x18\x06 \x01(\x0b\x32\x14.context.SliceStatus\"=\n\x0bSliceStatus\x12.\n\x0cslice_status\x18\x01 \x01(\x0e\x32\x18.context.SliceStatusEnum\"2\n\x0bSliceIdList\x12#\n\tslice_ids\x18\x01 \x03(\x0b\x32\x10.context.SliceId\"+\n\tSliceList\x12\x1e\n\x06slices\x18\x01 \x03(\x0b\x32\x0e.context.Slice\"O\n\nSliceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12\"\n\x08slice_id\x18\x02 \x01(\x0b\x32\x10.context.SliceId\"6\n\x0c\x43onnectionId\x12&\n\x0f\x63onnection_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xc4\x01\n\nConnection\x12,\n\rconnection_id\x18\x01 \x01(\x0b\x32\x15.context.ConnectionId\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\x12\x33\n\x16path_hops_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\x0fsub_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\"A\n\x10\x43onnectionIdList\x12-\n\x0e\x63onnection_ids\x18\x01 \x03(\x0b\x32\x15.context.ConnectionId\":\n\x0e\x43onnectionList\x12(\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x13.context.Connection\"^\n\x0f\x43onnectionEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12,\n\rconnection_id\x18\x02 \x01(\x0b\x32\x15.context.ConnectionId\"\x82\x01\n\nEndPointId\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12$\n\rendpoint_uuid\x18\x03 \x01(\x0b\x32\r.context.Uuid\"\x86\x01\n\x08\x45ndPoint\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x15\n\rendpoint_type\x18\x02 \x01(\t\x12\x39\n\x10kpi_sample_types\x18\x03 \x03(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\"e\n\nConfigRule\x12)\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x19.context.ConfigActionEnum\x12\x14\n\x0cresource_key\x18\x02 \x01(\t\x12\x16\n\x0eresource_value\x18\x03 \x01(\t\"?\n\nConstraint\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"^\n\x12TeraFlowController\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x12\n\nip_address\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\"U\n\x14\x41uthenticationResult\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x15\n\rauthenticated\x18\x02 \x01(\x08*j\n\rEventTypeEnum\x12\x17\n\x13\x45VENTTYPE_UNDEFINED\x10\x00\x12\x14\n\x10\x45VENTTYPE_CREATE\x10\x01\x12\x14\n\x10\x45VENTTYPE_UPDATE\x10\x02\x12\x14\n\x10\x45VENTTYPE_REMOVE\x10\x03*\xc5\x01\n\x10\x44\x65viceDriverEnum\x12\x1a\n\x16\x44\x45VICEDRIVER_UNDEFINED\x10\x00\x12\x1b\n\x17\x44\x45VICEDRIVER_OPENCONFIG\x10\x01\x12\x1e\n\x1a\x44\x45VICEDRIVER_TRANSPORT_API\x10\x02\x12\x13\n\x0f\x44\x45VICEDRIVER_P4\x10\x03\x12&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOGY\x10\x04\x12\x1b\n\x17\x44\x45VICEDRIVER_ONF_TR_352\x10\x05*\x8f\x01\n\x1b\x44\x65viceOperationalStatusEnum\x12%\n!DEVICEOPERATIONALSTATUS_UNDEFINED\x10\x00\x12$\n DEVICEOPERATIONALSTATUS_DISABLED\x10\x01\x12#\n\x1f\x44\x45VICEOPERATIONALSTATUS_ENABLED\x10\x02*\x81\x01\n\x0fServiceTypeEnum\x12\x17\n\x13SERVICETYPE_UNKNOWN\x10\x00\x12\x14\n\x10SERVICETYPE_L3NM\x10\x01\x12\x14\n\x10SERVICETYPE_L2NM\x10\x02\x12)\n%SERVICETYPE_TAPI_CONNECTIVITY_SERVICE\x10\x03*\x88\x01\n\x11ServiceStatusEnum\x12\x1b\n\x17SERVICESTATUS_UNDEFINED\x10\x00\x12\x19\n\x15SERVICESTATUS_PLANNED\x10\x01\x12\x18\n\x14SERVICESTATUS_ACTIVE\x10\x02\x12!\n\x1dSERVICESTATUS_PENDING_REMOVAL\x10\x03*\x8b\x01\n\x0fSliceStatusEnum\x12\x19\n\x15SLICESTATUS_UNDEFINED\x10\x00\x12\x17\n\x13SLICESTATUS_PLANNED\x10\x01\x12\x14\n\x10SLICESTATUS_INIT\x10\x02\x12\x16\n\x12SLICESTATUS_ACTIVE\x10\x03\x12\x16\n\x12SLICESTATUS_DEINIT\x10\x04*]\n\x10\x43onfigActionEnum\x12\x1a\n\x16\x43ONFIGACTION_UNDEFINED\x10\x00\x12\x14\n\x10\x43ONFIGACTION_SET\x10\x01\x12\x17\n\x13\x43ONFIGACTION_DELETE\x10\x02\x32\xef\x12\n\x0e\x43ontextService\x12:\n\x0eListContextIds\x12\x0e.context.Empty\x1a\x16.context.ContextIdList\"\x00\x12\x36\n\x0cListContexts\x12\x0e.context.Empty\x1a\x14.context.ContextList\"\x00\x12\x34\n\nGetContext\x12\x12.context.ContextId\x1a\x10.context.Context\"\x00\x12\x34\n\nSetContext\x12\x10.context.Context\x1a\x12.context.ContextId\"\x00\x12\x35\n\rRemoveContext\x12\x12.context.ContextId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetContextEvents\x12\x0e.context.Empty\x1a\x15.context.ContextEvent\"\x00\x30\x01\x12@\n\x0fListTopologyIds\x12\x12.context.ContextId\x1a\x17.context.TopologyIdList\"\x00\x12=\n\x0eListTopologies\x12\x12.context.ContextId\x1a\x15.context.TopologyList\"\x00\x12\x37\n\x0bGetTopology\x12\x13.context.TopologyId\x1a\x11.context.Topology\"\x00\x12\x37\n\x0bSetTopology\x12\x11.context.Topology\x1a\x13.context.TopologyId\"\x00\x12\x37\n\x0eRemoveTopology\x12\x13.context.TopologyId\x1a\x0e.context.Empty\"\x00\x12?\n\x11GetTopologyEvents\x12\x0e.context.Empty\x1a\x16.context.TopologyEvent\"\x00\x30\x01\x12\x38\n\rListDeviceIds\x12\x0e.context.Empty\x1a\x15.context.DeviceIdList\"\x00\x12\x34\n\x0bListDevices\x12\x0e.context.Empty\x1a\x13.context.DeviceList\"\x00\x12\x31\n\tGetDevice\x12\x11.context.DeviceId\x1a\x0f.context.Device\"\x00\x12\x31\n\tSetDevice\x12\x0f.context.Device\x1a\x11.context.DeviceId\"\x00\x12\x33\n\x0cRemoveDevice\x12\x11.context.DeviceId\x1a\x0e.context.Empty\"\x00\x12;\n\x0fGetDeviceEvents\x12\x0e.context.Empty\x1a\x14.context.DeviceEvent\"\x00\x30\x01\x12\x34\n\x0bListLinkIds\x12\x0e.context.Empty\x1a\x13.context.LinkIdList\"\x00\x12\x30\n\tListLinks\x12\x0e.context.Empty\x1a\x11.context.LinkList\"\x00\x12+\n\x07GetLink\x12\x0f.context.LinkId\x1a\r.context.Link\"\x00\x12+\n\x07SetLink\x12\r.context.Link\x1a\x0f.context.LinkId\"\x00\x12/\n\nRemoveLink\x12\x0f.context.LinkId\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetLinkEvents\x12\x0e.context.Empty\x1a\x12.context.LinkEvent\"\x00\x30\x01\x12>\n\x0eListServiceIds\x12\x12.context.ContextId\x1a\x16.context.ServiceIdList\"\x00\x12:\n\x0cListServices\x12\x12.context.ContextId\x1a\x14.context.ServiceList\"\x00\x12\x34\n\nGetService\x12\x12.context.ServiceId\x1a\x10.context.Service\"\x00\x12\x34\n\nSetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x35\n\rRemoveService\x12\x12.context.ServiceId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetServiceEvents\x12\x0e.context.Empty\x1a\x15.context.ServiceEvent\"\x00\x30\x01\x12:\n\x0cListSliceIds\x12\x12.context.ContextId\x1a\x14.context.SliceIdList\"\x00\x12\x36\n\nListSlices\x12\x12.context.ContextId\x1a\x12.context.SliceList\"\x00\x12.\n\x08GetSlice\x12\x10.context.SliceId\x1a\x0e.context.Slice\"\x00\x12.\n\x08SetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x31\n\x0bRemoveSlice\x12\x10.context.SliceId\x1a\x0e.context.Empty\"\x00\x12\x39\n\x0eGetSliceEvents\x12\x0e.context.Empty\x1a\x13.context.SliceEvent\"\x00\x30\x01\x12\x44\n\x11ListConnectionIds\x12\x12.context.ServiceId\x1a\x19.context.ConnectionIdList\"\x00\x12@\n\x0fListConnections\x12\x12.context.ServiceId\x1a\x17.context.ConnectionList\"\x00\x12=\n\rGetConnection\x12\x15.context.ConnectionId\x1a\x13.context.Connection\"\x00\x12=\n\rSetConnection\x12\x13.context.Connection\x1a\x15.context.ConnectionId\"\x00\x12;\n\x10RemoveConnection\x12\x15.context.ConnectionId\x1a\x0e.context.Empty\"\x00\x12\x43\n\x13GetConnectionEvents\x12\x0e.context.Empty\x1a\x18.context.ConnectionEvent\"\x00\x30\x01\x62\x06proto3'
+  ,
+  dependencies=[kpi__sample__types__pb2.DESCRIPTOR,])
+
+_EVENTTYPEENUM = _descriptor.EnumDescriptor(
+  name='EventTypeEnum',
+  full_name='context.EventTypeEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='EVENTTYPE_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='EVENTTYPE_CREATE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='EVENTTYPE_UPDATE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='EVENTTYPE_REMOVE', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=4310,
+  serialized_end=4416,
+)
+_sym_db.RegisterEnumDescriptor(_EVENTTYPEENUM)
+
+EventTypeEnum = enum_type_wrapper.EnumTypeWrapper(_EVENTTYPEENUM)
+_DEVICEDRIVERENUM = _descriptor.EnumDescriptor(
+  name='DeviceDriverEnum',
+  full_name='context.DeviceDriverEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEDRIVER_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEDRIVER_OPENCONFIG', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEDRIVER_TRANSPORT_API', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEDRIVER_P4', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEDRIVER_IETF_NETWORK_TOPOLOGY', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEDRIVER_ONF_TR_352', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=4419,
+  serialized_end=4616,
+)
+_sym_db.RegisterEnumDescriptor(_DEVICEDRIVERENUM)
+
+DeviceDriverEnum = enum_type_wrapper.EnumTypeWrapper(_DEVICEDRIVERENUM)
+_DEVICEOPERATIONALSTATUSENUM = _descriptor.EnumDescriptor(
+  name='DeviceOperationalStatusEnum',
+  full_name='context.DeviceOperationalStatusEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEOPERATIONALSTATUS_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEOPERATIONALSTATUS_DISABLED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEVICEOPERATIONALSTATUS_ENABLED', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=4619,
+  serialized_end=4762,
+)
+_sym_db.RegisterEnumDescriptor(_DEVICEOPERATIONALSTATUSENUM)
+
+DeviceOperationalStatusEnum = enum_type_wrapper.EnumTypeWrapper(_DEVICEOPERATIONALSTATUSENUM)
+_SERVICETYPEENUM = _descriptor.EnumDescriptor(
+  name='ServiceTypeEnum',
+  full_name='context.ServiceTypeEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='SERVICETYPE_UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICETYPE_L3NM', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICETYPE_L2NM', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICETYPE_TAPI_CONNECTIVITY_SERVICE', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=4765,
+  serialized_end=4894,
+)
+_sym_db.RegisterEnumDescriptor(_SERVICETYPEENUM)
+
+ServiceTypeEnum = enum_type_wrapper.EnumTypeWrapper(_SERVICETYPEENUM)
+_SERVICESTATUSENUM = _descriptor.EnumDescriptor(
+  name='ServiceStatusEnum',
+  full_name='context.ServiceStatusEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='SERVICESTATUS_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICESTATUS_PLANNED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICESTATUS_ACTIVE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SERVICESTATUS_PENDING_REMOVAL', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=4897,
+  serialized_end=5033,
+)
+_sym_db.RegisterEnumDescriptor(_SERVICESTATUSENUM)
+
+ServiceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SERVICESTATUSENUM)
+_SLICESTATUSENUM = _descriptor.EnumDescriptor(
+  name='SliceStatusEnum',
+  full_name='context.SliceStatusEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='SLICESTATUS_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SLICESTATUS_PLANNED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SLICESTATUS_INIT', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SLICESTATUS_ACTIVE', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SLICESTATUS_DEINIT', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=5036,
+  serialized_end=5175,
+)
+_sym_db.RegisterEnumDescriptor(_SLICESTATUSENUM)
+
+SliceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SLICESTATUSENUM)
+_CONFIGACTIONENUM = _descriptor.EnumDescriptor(
+  name='ConfigActionEnum',
+  full_name='context.ConfigActionEnum',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='CONFIGACTION_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CONFIGACTION_SET', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CONFIGACTION_DELETE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=5177,
+  serialized_end=5270,
+)
+_sym_db.RegisterEnumDescriptor(_CONFIGACTIONENUM)
+
+ConfigActionEnum = enum_type_wrapper.EnumTypeWrapper(_CONFIGACTIONENUM)
+EVENTTYPE_UNDEFINED = 0
+EVENTTYPE_CREATE = 1
+EVENTTYPE_UPDATE = 2
+EVENTTYPE_REMOVE = 3
+DEVICEDRIVER_UNDEFINED = 0
+DEVICEDRIVER_OPENCONFIG = 1
+DEVICEDRIVER_TRANSPORT_API = 2
+DEVICEDRIVER_P4 = 3
+DEVICEDRIVER_IETF_NETWORK_TOPOLOGY = 4
+DEVICEDRIVER_ONF_TR_352 = 5
+DEVICEOPERATIONALSTATUS_UNDEFINED = 0
+DEVICEOPERATIONALSTATUS_DISABLED = 1
+DEVICEOPERATIONALSTATUS_ENABLED = 2
+SERVICETYPE_UNKNOWN = 0
+SERVICETYPE_L3NM = 1
+SERVICETYPE_L2NM = 2
+SERVICETYPE_TAPI_CONNECTIVITY_SERVICE = 3
+SERVICESTATUS_UNDEFINED = 0
+SERVICESTATUS_PLANNED = 1
+SERVICESTATUS_ACTIVE = 2
+SERVICESTATUS_PENDING_REMOVAL = 3
+SLICESTATUS_UNDEFINED = 0
+SLICESTATUS_PLANNED = 1
+SLICESTATUS_INIT = 2
+SLICESTATUS_ACTIVE = 3
+SLICESTATUS_DEINIT = 4
+CONFIGACTION_UNDEFINED = 0
+CONFIGACTION_SET = 1
+CONFIGACTION_DELETE = 2
+
+
+
+_EMPTY = _descriptor.Descriptor(
+  name='Empty',
+  full_name='context.Empty',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=50,
+  serialized_end=57,
+)
+
+
+_UUID = _descriptor.Descriptor(
+  name='Uuid',
+  full_name='context.Uuid',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='uuid', full_name='context.Uuid.uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=59,
+  serialized_end=79,
+)
+
+
+_EVENT = _descriptor.Descriptor(
+  name='Event',
+  full_name='context.Event',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='context.Event.timestamp', index=0,
+      number=1, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='context.Event.event_type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=81,
+  serialized_end=151,
+)
+
+
+_CONTEXTID = _descriptor.Descriptor(
+  name='ContextId',
+  full_name='context.ContextId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_uuid', full_name='context.ContextId.context_uuid', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=153,
+  serialized_end=201,
+)
+
+
+_CONTEXT = _descriptor.Descriptor(
+  name='Context',
+  full_name='context.Context',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.Context.context_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='topology_ids', full_name='context.Context.topology_ids', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_ids', full_name='context.Context.service_ids', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='controller', full_name='context.Context.controller', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=204,
+  serialized_end=386,
+)
+
+
+_CONTEXTIDLIST = _descriptor.Descriptor(
+  name='ContextIdList',
+  full_name='context.ContextIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_ids', full_name='context.ContextIdList.context_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=388,
+  serialized_end=444,
+)
+
+
+_CONTEXTLIST = _descriptor.Descriptor(
+  name='ContextList',
+  full_name='context.ContextList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='contexts', full_name='context.ContextList.contexts', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=446,
+  serialized_end=495,
+)
+
+
+_CONTEXTEVENT = _descriptor.Descriptor(
+  name='ContextEvent',
+  full_name='context.ContextEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.ContextEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.ContextEvent.context_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=497,
+  serialized_end=582,
+)
+
+
+_TOPOLOGYID = _descriptor.Descriptor(
+  name='TopologyId',
+  full_name='context.TopologyId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.TopologyId.context_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='topology_uuid', full_name='context.TopologyId.topology_uuid', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=584,
+  serialized_end=674,
+)
+
+
+_TOPOLOGY = _descriptor.Descriptor(
+  name='Topology',
+  full_name='context.Topology',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topology_id', full_name='context.Topology.topology_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_ids', full_name='context.Topology.device_ids', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='link_ids', full_name='context.Topology.link_ids', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=676,
+  serialized_end=802,
+)
+
+
+_TOPOLOGYIDLIST = _descriptor.Descriptor(
+  name='TopologyIdList',
+  full_name='context.TopologyIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topology_ids', full_name='context.TopologyIdList.topology_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=804,
+  serialized_end=863,
+)
+
+
+_TOPOLOGYLIST = _descriptor.Descriptor(
+  name='TopologyList',
+  full_name='context.TopologyList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topologies', full_name='context.TopologyList.topologies', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=865,
+  serialized_end=918,
+)
+
+
+_TOPOLOGYEVENT = _descriptor.Descriptor(
+  name='TopologyEvent',
+  full_name='context.TopologyEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.TopologyEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='topology_id', full_name='context.TopologyEvent.topology_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=920,
+  serialized_end=1008,
+)
+
+
+_DEVICEID = _descriptor.Descriptor(
+  name='DeviceId',
+  full_name='context.DeviceId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='device_uuid', full_name='context.DeviceId.device_uuid', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1010,
+  serialized_end=1056,
+)
+
+
+_DEVICE = _descriptor.Descriptor(
+  name='Device',
+  full_name='context.Device',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='device_id', full_name='context.Device.device_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_type', full_name='context.Device.device_type', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_config', full_name='context.Device.device_config', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_operational_status', full_name='context.Device.device_operational_status', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_drivers', full_name='context.Device.device_drivers', index=4,
+      number=5, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_endpoints', full_name='context.Device.device_endpoints', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1059,
+  serialized_end=1341,
+)
+
+
+_DEVICECONFIG = _descriptor.Descriptor(
+  name='DeviceConfig',
+  full_name='context.DeviceConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='config_rules', full_name='context.DeviceConfig.config_rules', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1343,
+  serialized_end=1400,
+)
+
+
+_DEVICEIDLIST = _descriptor.Descriptor(
+  name='DeviceIdList',
+  full_name='context.DeviceIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='device_ids', full_name='context.DeviceIdList.device_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1402,
+  serialized_end=1455,
+)
+
+
+_DEVICELIST = _descriptor.Descriptor(
+  name='DeviceList',
+  full_name='context.DeviceList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='devices', full_name='context.DeviceList.devices', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1457,
+  serialized_end=1503,
+)
+
+
+_DEVICEEVENT = _descriptor.Descriptor(
+  name='DeviceEvent',
+  full_name='context.DeviceEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.DeviceEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_id', full_name='context.DeviceEvent.device_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1505,
+  serialized_end=1587,
+)
+
+
+_LINKID = _descriptor.Descriptor(
+  name='LinkId',
+  full_name='context.LinkId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='link_uuid', full_name='context.LinkId.link_uuid', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1589,
+  serialized_end=1631,
+)
+
+
+_LINK = _descriptor.Descriptor(
+  name='Link',
+  full_name='context.Link',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='link_id', full_name='context.Link.link_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='link_endpoint_ids', full_name='context.Link.link_endpoint_ids', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1633,
+  serialized_end=1721,
+)
+
+
+_LINKIDLIST = _descriptor.Descriptor(
+  name='LinkIdList',
+  full_name='context.LinkIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='link_ids', full_name='context.LinkIdList.link_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1723,
+  serialized_end=1770,
+)
+
+
+_LINKLIST = _descriptor.Descriptor(
+  name='LinkList',
+  full_name='context.LinkList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='links', full_name='context.LinkList.links', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1772,
+  serialized_end=1812,
+)
+
+
+_LINKEVENT = _descriptor.Descriptor(
+  name='LinkEvent',
+  full_name='context.LinkEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.LinkEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='link_id', full_name='context.LinkEvent.link_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1814,
+  serialized_end=1890,
+)
+
+
+_SERVICEID = _descriptor.Descriptor(
+  name='ServiceId',
+  full_name='context.ServiceId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.ServiceId.context_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_uuid', full_name='context.ServiceId.service_uuid', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1892,
+  serialized_end=1980,
+)
+
+
+_SERVICE = _descriptor.Descriptor(
+  name='Service',
+  full_name='context.Service',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='service_id', full_name='context.Service.service_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_type', full_name='context.Service.service_type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_endpoint_ids', full_name='context.Service.service_endpoint_ids', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_constraints', full_name='context.Service.service_constraints', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_status', full_name='context.Service.service_status', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_config', full_name='context.Service.service_config', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1983,
+  serialized_end=2277,
+)
+
+
+_SERVICESTATUS = _descriptor.Descriptor(
+  name='ServiceStatus',
+  full_name='context.ServiceStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='service_status', full_name='context.ServiceStatus.service_status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2279,
+  serialized_end=2346,
+)
+
+
+_SERVICECONFIG = _descriptor.Descriptor(
+  name='ServiceConfig',
+  full_name='context.ServiceConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='config_rules', full_name='context.ServiceConfig.config_rules', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2348,
+  serialized_end=2406,
+)
+
+
+_SERVICEIDLIST = _descriptor.Descriptor(
+  name='ServiceIdList',
+  full_name='context.ServiceIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='service_ids', full_name='context.ServiceIdList.service_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2408,
+  serialized_end=2464,
+)
+
+
+_SERVICELIST = _descriptor.Descriptor(
+  name='ServiceList',
+  full_name='context.ServiceList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='services', full_name='context.ServiceList.services', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2466,
+  serialized_end=2515,
+)
+
+
+_SERVICEEVENT = _descriptor.Descriptor(
+  name='ServiceEvent',
+  full_name='context.ServiceEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.ServiceEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_id', full_name='context.ServiceEvent.service_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2517,
+  serialized_end=2602,
+)
+
+
+_SLICEID = _descriptor.Descriptor(
+  name='SliceId',
+  full_name='context.SliceId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.SliceId.context_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_uuid', full_name='context.SliceId.slice_uuid', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2604,
+  serialized_end=2688,
+)
+
+
+_SLICE = _descriptor.Descriptor(
+  name='Slice',
+  full_name='context.Slice',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='slice_id', full_name='context.Slice.slice_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_endpoint_ids', full_name='context.Slice.slice_endpoint_ids', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_constraints', full_name='context.Slice.slice_constraints', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_service_ids', full_name='context.Slice.slice_service_ids', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_subslice_ids', full_name='context.Slice.slice_subslice_ids', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_status', full_name='context.Slice.slice_status', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2691,
+  serialized_end=2968,
+)
+
+
+_SLICESTATUS = _descriptor.Descriptor(
+  name='SliceStatus',
+  full_name='context.SliceStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='slice_status', full_name='context.SliceStatus.slice_status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2970,
+  serialized_end=3031,
+)
+
+
+_SLICEIDLIST = _descriptor.Descriptor(
+  name='SliceIdList',
+  full_name='context.SliceIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='slice_ids', full_name='context.SliceIdList.slice_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3033,
+  serialized_end=3083,
+)
+
+
+_SLICELIST = _descriptor.Descriptor(
+  name='SliceList',
+  full_name='context.SliceList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='slices', full_name='context.SliceList.slices', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3085,
+  serialized_end=3128,
+)
+
+
+_SLICEEVENT = _descriptor.Descriptor(
+  name='SliceEvent',
+  full_name='context.SliceEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.SliceEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='slice_id', full_name='context.SliceEvent.slice_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3130,
+  serialized_end=3209,
+)
+
+
+_CONNECTIONID = _descriptor.Descriptor(
+  name='ConnectionId',
+  full_name='context.ConnectionId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='connection_uuid', full_name='context.ConnectionId.connection_uuid', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3211,
+  serialized_end=3265,
+)
+
+
+_CONNECTION = _descriptor.Descriptor(
+  name='Connection',
+  full_name='context.Connection',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='connection_id', full_name='context.Connection.connection_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_id', full_name='context.Connection.service_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='path_hops_endpoint_ids', full_name='context.Connection.path_hops_endpoint_ids', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sub_service_ids', full_name='context.Connection.sub_service_ids', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3268,
+  serialized_end=3464,
+)
+
+
+_CONNECTIONIDLIST = _descriptor.Descriptor(
+  name='ConnectionIdList',
+  full_name='context.ConnectionIdList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='connection_ids', full_name='context.ConnectionIdList.connection_ids', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3466,
+  serialized_end=3531,
+)
+
+
+_CONNECTIONLIST = _descriptor.Descriptor(
+  name='ConnectionList',
+  full_name='context.ConnectionList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='connections', full_name='context.ConnectionList.connections', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3533,
+  serialized_end=3591,
+)
+
+
+_CONNECTIONEVENT = _descriptor.Descriptor(
+  name='ConnectionEvent',
+  full_name='context.ConnectionEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='context.ConnectionEvent.event', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='connection_id', full_name='context.ConnectionEvent.connection_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3593,
+  serialized_end=3687,
+)
+
+
+_ENDPOINTID = _descriptor.Descriptor(
+  name='EndPointId',
+  full_name='context.EndPointId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topology_id', full_name='context.EndPointId.topology_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_id', full_name='context.EndPointId.device_id', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='endpoint_uuid', full_name='context.EndPointId.endpoint_uuid', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3690,
+  serialized_end=3820,
+)
+
+
+_ENDPOINT = _descriptor.Descriptor(
+  name='EndPoint',
+  full_name='context.EndPoint',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='endpoint_id', full_name='context.EndPoint.endpoint_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='endpoint_type', full_name='context.EndPoint.endpoint_type', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='kpi_sample_types', full_name='context.EndPoint.kpi_sample_types', index=2,
+      number=3, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3823,
+  serialized_end=3957,
+)
+
+
+_CONFIGRULE = _descriptor.Descriptor(
+  name='ConfigRule',
+  full_name='context.ConfigRule',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='action', full_name='context.ConfigRule.action', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resource_key', full_name='context.ConfigRule.resource_key', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resource_value', full_name='context.ConfigRule.resource_value', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3959,
+  serialized_end=4060,
+)
+
+
+_CONSTRAINT = _descriptor.Descriptor(
+  name='Constraint',
+  full_name='context.Constraint',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='constraint_type', full_name='context.Constraint.constraint_type', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='constraint_value', full_name='context.Constraint.constraint_value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4062,
+  serialized_end=4125,
+)
+
+
+_TERAFLOWCONTROLLER = _descriptor.Descriptor(
+  name='TeraFlowController',
+  full_name='context.TeraFlowController',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.TeraFlowController.context_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ip_address', full_name='context.TeraFlowController.ip_address', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='port', full_name='context.TeraFlowController.port', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4127,
+  serialized_end=4221,
+)
+
+
+_AUTHENTICATIONRESULT = _descriptor.Descriptor(
+  name='AuthenticationResult',
+  full_name='context.AuthenticationResult',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='context_id', full_name='context.AuthenticationResult.context_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='authenticated', full_name='context.AuthenticationResult.authenticated', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4223,
+  serialized_end=4308,
+)
+
+_EVENT.fields_by_name['event_type'].enum_type = _EVENTTYPEENUM
+_CONTEXTID.fields_by_name['context_uuid'].message_type = _UUID
+_CONTEXT.fields_by_name['context_id'].message_type = _CONTEXTID
+_CONTEXT.fields_by_name['topology_ids'].message_type = _TOPOLOGYID
+_CONTEXT.fields_by_name['service_ids'].message_type = _SERVICEID
+_CONTEXT.fields_by_name['controller'].message_type = _TERAFLOWCONTROLLER
+_CONTEXTIDLIST.fields_by_name['context_ids'].message_type = _CONTEXTID
+_CONTEXTLIST.fields_by_name['contexts'].message_type = _CONTEXT
+_CONTEXTEVENT.fields_by_name['event'].message_type = _EVENT
+_CONTEXTEVENT.fields_by_name['context_id'].message_type = _CONTEXTID
+_TOPOLOGYID.fields_by_name['context_id'].message_type = _CONTEXTID
+_TOPOLOGYID.fields_by_name['topology_uuid'].message_type = _UUID
+_TOPOLOGY.fields_by_name['topology_id'].message_type = _TOPOLOGYID
+_TOPOLOGY.fields_by_name['device_ids'].message_type = _DEVICEID
+_TOPOLOGY.fields_by_name['link_ids'].message_type = _LINKID
+_TOPOLOGYIDLIST.fields_by_name['topology_ids'].message_type = _TOPOLOGYID
+_TOPOLOGYLIST.fields_by_name['topologies'].message_type = _TOPOLOGY
+_TOPOLOGYEVENT.fields_by_name['event'].message_type = _EVENT
+_TOPOLOGYEVENT.fields_by_name['topology_id'].message_type = _TOPOLOGYID
+_DEVICEID.fields_by_name['device_uuid'].message_type = _UUID
+_DEVICE.fields_by_name['device_id'].message_type = _DEVICEID
+_DEVICE.fields_by_name['device_config'].message_type = _DEVICECONFIG
+_DEVICE.fields_by_name['device_operational_status'].enum_type = _DEVICEOPERATIONALSTATUSENUM
+_DEVICE.fields_by_name['device_drivers'].enum_type = _DEVICEDRIVERENUM
+_DEVICE.fields_by_name['device_endpoints'].message_type = _ENDPOINT
+_DEVICECONFIG.fields_by_name['config_rules'].message_type = _CONFIGRULE
+_DEVICEIDLIST.fields_by_name['device_ids'].message_type = _DEVICEID
+_DEVICELIST.fields_by_name['devices'].message_type = _DEVICE
+_DEVICEEVENT.fields_by_name['event'].message_type = _EVENT
+_DEVICEEVENT.fields_by_name['device_id'].message_type = _DEVICEID
+_LINKID.fields_by_name['link_uuid'].message_type = _UUID
+_LINK.fields_by_name['link_id'].message_type = _LINKID
+_LINK.fields_by_name['link_endpoint_ids'].message_type = _ENDPOINTID
+_LINKIDLIST.fields_by_name['link_ids'].message_type = _LINKID
+_LINKLIST.fields_by_name['links'].message_type = _LINK
+_LINKEVENT.fields_by_name['event'].message_type = _EVENT
+_LINKEVENT.fields_by_name['link_id'].message_type = _LINKID
+_SERVICEID.fields_by_name['context_id'].message_type = _CONTEXTID
+_SERVICEID.fields_by_name['service_uuid'].message_type = _UUID
+_SERVICE.fields_by_name['service_id'].message_type = _SERVICEID
+_SERVICE.fields_by_name['service_type'].enum_type = _SERVICETYPEENUM
+_SERVICE.fields_by_name['service_endpoint_ids'].message_type = _ENDPOINTID
+_SERVICE.fields_by_name['service_constraints'].message_type = _CONSTRAINT
+_SERVICE.fields_by_name['service_status'].message_type = _SERVICESTATUS
+_SERVICE.fields_by_name['service_config'].message_type = _SERVICECONFIG
+_SERVICESTATUS.fields_by_name['service_status'].enum_type = _SERVICESTATUSENUM
+_SERVICECONFIG.fields_by_name['config_rules'].message_type = _CONFIGRULE
+_SERVICEIDLIST.fields_by_name['service_ids'].message_type = _SERVICEID
+_SERVICELIST.fields_by_name['services'].message_type = _SERVICE
+_SERVICEEVENT.fields_by_name['event'].message_type = _EVENT
+_SERVICEEVENT.fields_by_name['service_id'].message_type = _SERVICEID
+_SLICEID.fields_by_name['context_id'].message_type = _CONTEXTID
+_SLICEID.fields_by_name['slice_uuid'].message_type = _UUID
+_SLICE.fields_by_name['slice_id'].message_type = _SLICEID
+_SLICE.fields_by_name['slice_endpoint_ids'].message_type = _ENDPOINTID
+_SLICE.fields_by_name['slice_constraints'].message_type = _CONSTRAINT
+_SLICE.fields_by_name['slice_service_ids'].message_type = _SERVICEID
+_SLICE.fields_by_name['slice_subslice_ids'].message_type = _SLICEID
+_SLICE.fields_by_name['slice_status'].message_type = _SLICESTATUS
+_SLICESTATUS.fields_by_name['slice_status'].enum_type = _SLICESTATUSENUM
+_SLICEIDLIST.fields_by_name['slice_ids'].message_type = _SLICEID
+_SLICELIST.fields_by_name['slices'].message_type = _SLICE
+_SLICEEVENT.fields_by_name['event'].message_type = _EVENT
+_SLICEEVENT.fields_by_name['slice_id'].message_type = _SLICEID
+_CONNECTIONID.fields_by_name['connection_uuid'].message_type = _UUID
+_CONNECTION.fields_by_name['connection_id'].message_type = _CONNECTIONID
+_CONNECTION.fields_by_name['service_id'].message_type = _SERVICEID
+_CONNECTION.fields_by_name['path_hops_endpoint_ids'].message_type = _ENDPOINTID
+_CONNECTION.fields_by_name['sub_service_ids'].message_type = _SERVICEID
+_CONNECTIONIDLIST.fields_by_name['connection_ids'].message_type = _CONNECTIONID
+_CONNECTIONLIST.fields_by_name['connections'].message_type = _CONNECTION
+_CONNECTIONEVENT.fields_by_name['event'].message_type = _EVENT
+_CONNECTIONEVENT.fields_by_name['connection_id'].message_type = _CONNECTIONID
+_ENDPOINTID.fields_by_name['topology_id'].message_type = _TOPOLOGYID
+_ENDPOINTID.fields_by_name['device_id'].message_type = _DEVICEID
+_ENDPOINTID.fields_by_name['endpoint_uuid'].message_type = _UUID
+_ENDPOINT.fields_by_name['endpoint_id'].message_type = _ENDPOINTID
+_ENDPOINT.fields_by_name['kpi_sample_types'].enum_type = kpi__sample__types__pb2._KPISAMPLETYPE
+_CONFIGRULE.fields_by_name['action'].enum_type = _CONFIGACTIONENUM
+_TERAFLOWCONTROLLER.fields_by_name['context_id'].message_type = _CONTEXTID
+_AUTHENTICATIONRESULT.fields_by_name['context_id'].message_type = _CONTEXTID
+DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY
+DESCRIPTOR.message_types_by_name['Uuid'] = _UUID
+DESCRIPTOR.message_types_by_name['Event'] = _EVENT
+DESCRIPTOR.message_types_by_name['ContextId'] = _CONTEXTID
+DESCRIPTOR.message_types_by_name['Context'] = _CONTEXT
+DESCRIPTOR.message_types_by_name['ContextIdList'] = _CONTEXTIDLIST
+DESCRIPTOR.message_types_by_name['ContextList'] = _CONTEXTLIST
+DESCRIPTOR.message_types_by_name['ContextEvent'] = _CONTEXTEVENT
+DESCRIPTOR.message_types_by_name['TopologyId'] = _TOPOLOGYID
+DESCRIPTOR.message_types_by_name['Topology'] = _TOPOLOGY
+DESCRIPTOR.message_types_by_name['TopologyIdList'] = _TOPOLOGYIDLIST
+DESCRIPTOR.message_types_by_name['TopologyList'] = _TOPOLOGYLIST
+DESCRIPTOR.message_types_by_name['TopologyEvent'] = _TOPOLOGYEVENT
+DESCRIPTOR.message_types_by_name['DeviceId'] = _DEVICEID
+DESCRIPTOR.message_types_by_name['Device'] = _DEVICE
+DESCRIPTOR.message_types_by_name['DeviceConfig'] = _DEVICECONFIG
+DESCRIPTOR.message_types_by_name['DeviceIdList'] = _DEVICEIDLIST
+DESCRIPTOR.message_types_by_name['DeviceList'] = _DEVICELIST
+DESCRIPTOR.message_types_by_name['DeviceEvent'] = _DEVICEEVENT
+DESCRIPTOR.message_types_by_name['LinkId'] = _LINKID
+DESCRIPTOR.message_types_by_name['Link'] = _LINK
+DESCRIPTOR.message_types_by_name['LinkIdList'] = _LINKIDLIST
+DESCRIPTOR.message_types_by_name['LinkList'] = _LINKLIST
+DESCRIPTOR.message_types_by_name['LinkEvent'] = _LINKEVENT
+DESCRIPTOR.message_types_by_name['ServiceId'] = _SERVICEID
+DESCRIPTOR.message_types_by_name['Service'] = _SERVICE
+DESCRIPTOR.message_types_by_name['ServiceStatus'] = _SERVICESTATUS
+DESCRIPTOR.message_types_by_name['ServiceConfig'] = _SERVICECONFIG
+DESCRIPTOR.message_types_by_name['ServiceIdList'] = _SERVICEIDLIST
+DESCRIPTOR.message_types_by_name['ServiceList'] = _SERVICELIST
+DESCRIPTOR.message_types_by_name['ServiceEvent'] = _SERVICEEVENT
+DESCRIPTOR.message_types_by_name['SliceId'] = _SLICEID
+DESCRIPTOR.message_types_by_name['Slice'] = _SLICE
+DESCRIPTOR.message_types_by_name['SliceStatus'] = _SLICESTATUS
+DESCRIPTOR.message_types_by_name['SliceIdList'] = _SLICEIDLIST
+DESCRIPTOR.message_types_by_name['SliceList'] = _SLICELIST
+DESCRIPTOR.message_types_by_name['SliceEvent'] = _SLICEEVENT
+DESCRIPTOR.message_types_by_name['ConnectionId'] = _CONNECTIONID
+DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION
+DESCRIPTOR.message_types_by_name['ConnectionIdList'] = _CONNECTIONIDLIST
+DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST
+DESCRIPTOR.message_types_by_name['ConnectionEvent'] = _CONNECTIONEVENT
+DESCRIPTOR.message_types_by_name['EndPointId'] = _ENDPOINTID
+DESCRIPTOR.message_types_by_name['EndPoint'] = _ENDPOINT
+DESCRIPTOR.message_types_by_name['ConfigRule'] = _CONFIGRULE
+DESCRIPTOR.message_types_by_name['Constraint'] = _CONSTRAINT
+DESCRIPTOR.message_types_by_name['TeraFlowController'] = _TERAFLOWCONTROLLER
+DESCRIPTOR.message_types_by_name['AuthenticationResult'] = _AUTHENTICATIONRESULT
+DESCRIPTOR.enum_types_by_name['EventTypeEnum'] = _EVENTTYPEENUM
+DESCRIPTOR.enum_types_by_name['DeviceDriverEnum'] = _DEVICEDRIVERENUM
+DESCRIPTOR.enum_types_by_name['DeviceOperationalStatusEnum'] = _DEVICEOPERATIONALSTATUSENUM
+DESCRIPTOR.enum_types_by_name['ServiceTypeEnum'] = _SERVICETYPEENUM
+DESCRIPTOR.enum_types_by_name['ServiceStatusEnum'] = _SERVICESTATUSENUM
+DESCRIPTOR.enum_types_by_name['SliceStatusEnum'] = _SLICESTATUSENUM
+DESCRIPTOR.enum_types_by_name['ConfigActionEnum'] = _CONFIGACTIONENUM
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {
+  'DESCRIPTOR' : _EMPTY,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Empty)
+  })
+_sym_db.RegisterMessage(Empty)
+
+Uuid = _reflection.GeneratedProtocolMessageType('Uuid', (_message.Message,), {
+  'DESCRIPTOR' : _UUID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Uuid)
+  })
+_sym_db.RegisterMessage(Uuid)
+
+Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), {
+  'DESCRIPTOR' : _EVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Event)
+  })
+_sym_db.RegisterMessage(Event)
+
+ContextId = _reflection.GeneratedProtocolMessageType('ContextId', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXTID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ContextId)
+  })
+_sym_db.RegisterMessage(ContextId)
+
+Context = _reflection.GeneratedProtocolMessageType('Context', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Context)
+  })
+_sym_db.RegisterMessage(Context)
+
+ContextIdList = _reflection.GeneratedProtocolMessageType('ContextIdList', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXTIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ContextIdList)
+  })
+_sym_db.RegisterMessage(ContextIdList)
+
+ContextList = _reflection.GeneratedProtocolMessageType('ContextList', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXTLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ContextList)
+  })
+_sym_db.RegisterMessage(ContextList)
+
+ContextEvent = _reflection.GeneratedProtocolMessageType('ContextEvent', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXTEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ContextEvent)
+  })
+_sym_db.RegisterMessage(ContextEvent)
+
+TopologyId = _reflection.GeneratedProtocolMessageType('TopologyId', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGYID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TopologyId)
+  })
+_sym_db.RegisterMessage(TopologyId)
+
+Topology = _reflection.GeneratedProtocolMessageType('Topology', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGY,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Topology)
+  })
+_sym_db.RegisterMessage(Topology)
+
+TopologyIdList = _reflection.GeneratedProtocolMessageType('TopologyIdList', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGYIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TopologyIdList)
+  })
+_sym_db.RegisterMessage(TopologyIdList)
+
+TopologyList = _reflection.GeneratedProtocolMessageType('TopologyList', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGYLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TopologyList)
+  })
+_sym_db.RegisterMessage(TopologyList)
+
+TopologyEvent = _reflection.GeneratedProtocolMessageType('TopologyEvent', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGYEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TopologyEvent)
+  })
+_sym_db.RegisterMessage(TopologyEvent)
+
+DeviceId = _reflection.GeneratedProtocolMessageType('DeviceId', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICEID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.DeviceId)
+  })
+_sym_db.RegisterMessage(DeviceId)
+
+Device = _reflection.GeneratedProtocolMessageType('Device', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICE,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Device)
+  })
+_sym_db.RegisterMessage(Device)
+
+DeviceConfig = _reflection.GeneratedProtocolMessageType('DeviceConfig', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICECONFIG,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.DeviceConfig)
+  })
+_sym_db.RegisterMessage(DeviceConfig)
+
+DeviceIdList = _reflection.GeneratedProtocolMessageType('DeviceIdList', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICEIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.DeviceIdList)
+  })
+_sym_db.RegisterMessage(DeviceIdList)
+
+DeviceList = _reflection.GeneratedProtocolMessageType('DeviceList', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICELIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.DeviceList)
+  })
+_sym_db.RegisterMessage(DeviceList)
+
+DeviceEvent = _reflection.GeneratedProtocolMessageType('DeviceEvent', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICEEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.DeviceEvent)
+  })
+_sym_db.RegisterMessage(DeviceEvent)
+
+LinkId = _reflection.GeneratedProtocolMessageType('LinkId', (_message.Message,), {
+  'DESCRIPTOR' : _LINKID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.LinkId)
+  })
+_sym_db.RegisterMessage(LinkId)
+
+Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), {
+  'DESCRIPTOR' : _LINK,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Link)
+  })
+_sym_db.RegisterMessage(Link)
+
+LinkIdList = _reflection.GeneratedProtocolMessageType('LinkIdList', (_message.Message,), {
+  'DESCRIPTOR' : _LINKIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.LinkIdList)
+  })
+_sym_db.RegisterMessage(LinkIdList)
+
+LinkList = _reflection.GeneratedProtocolMessageType('LinkList', (_message.Message,), {
+  'DESCRIPTOR' : _LINKLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.LinkList)
+  })
+_sym_db.RegisterMessage(LinkList)
+
+LinkEvent = _reflection.GeneratedProtocolMessageType('LinkEvent', (_message.Message,), {
+  'DESCRIPTOR' : _LINKEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.LinkEvent)
+  })
+_sym_db.RegisterMessage(LinkEvent)
+
+ServiceId = _reflection.GeneratedProtocolMessageType('ServiceId', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICEID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ServiceId)
+  })
+_sym_db.RegisterMessage(ServiceId)
+
+Service = _reflection.GeneratedProtocolMessageType('Service', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICE,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Service)
+  })
+_sym_db.RegisterMessage(Service)
+
+ServiceStatus = _reflection.GeneratedProtocolMessageType('ServiceStatus', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICESTATUS,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ServiceStatus)
+  })
+_sym_db.RegisterMessage(ServiceStatus)
+
+ServiceConfig = _reflection.GeneratedProtocolMessageType('ServiceConfig', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICECONFIG,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ServiceConfig)
+  })
+_sym_db.RegisterMessage(ServiceConfig)
+
+ServiceIdList = _reflection.GeneratedProtocolMessageType('ServiceIdList', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICEIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ServiceIdList)
+  })
+_sym_db.RegisterMessage(ServiceIdList)
+
+ServiceList = _reflection.GeneratedProtocolMessageType('ServiceList', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICELIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ServiceList)
+  })
+_sym_db.RegisterMessage(ServiceList)
+
+ServiceEvent = _reflection.GeneratedProtocolMessageType('ServiceEvent', (_message.Message,), {
+  'DESCRIPTOR' : _SERVICEEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ServiceEvent)
+  })
+_sym_db.RegisterMessage(ServiceEvent)
+
+SliceId = _reflection.GeneratedProtocolMessageType('SliceId', (_message.Message,), {
+  'DESCRIPTOR' : _SLICEID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.SliceId)
+  })
+_sym_db.RegisterMessage(SliceId)
+
+Slice = _reflection.GeneratedProtocolMessageType('Slice', (_message.Message,), {
+  'DESCRIPTOR' : _SLICE,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Slice)
+  })
+_sym_db.RegisterMessage(Slice)
+
+SliceStatus = _reflection.GeneratedProtocolMessageType('SliceStatus', (_message.Message,), {
+  'DESCRIPTOR' : _SLICESTATUS,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.SliceStatus)
+  })
+_sym_db.RegisterMessage(SliceStatus)
+
+SliceIdList = _reflection.GeneratedProtocolMessageType('SliceIdList', (_message.Message,), {
+  'DESCRIPTOR' : _SLICEIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.SliceIdList)
+  })
+_sym_db.RegisterMessage(SliceIdList)
+
+SliceList = _reflection.GeneratedProtocolMessageType('SliceList', (_message.Message,), {
+  'DESCRIPTOR' : _SLICELIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.SliceList)
+  })
+_sym_db.RegisterMessage(SliceList)
+
+SliceEvent = _reflection.GeneratedProtocolMessageType('SliceEvent', (_message.Message,), {
+  'DESCRIPTOR' : _SLICEEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.SliceEvent)
+  })
+_sym_db.RegisterMessage(SliceEvent)
+
+ConnectionId = _reflection.GeneratedProtocolMessageType('ConnectionId', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionId)
+  })
+_sym_db.RegisterMessage(ConnectionId)
+
+Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTION,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Connection)
+  })
+_sym_db.RegisterMessage(Connection)
+
+ConnectionIdList = _reflection.GeneratedProtocolMessageType('ConnectionIdList', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONIDLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionIdList)
+  })
+_sym_db.RegisterMessage(ConnectionIdList)
+
+ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONLIST,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionList)
+  })
+_sym_db.RegisterMessage(ConnectionList)
+
+ConnectionEvent = _reflection.GeneratedProtocolMessageType('ConnectionEvent', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONEVENT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConnectionEvent)
+  })
+_sym_db.RegisterMessage(ConnectionEvent)
+
+EndPointId = _reflection.GeneratedProtocolMessageType('EndPointId', (_message.Message,), {
+  'DESCRIPTOR' : _ENDPOINTID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.EndPointId)
+  })
+_sym_db.RegisterMessage(EndPointId)
+
+EndPoint = _reflection.GeneratedProtocolMessageType('EndPoint', (_message.Message,), {
+  'DESCRIPTOR' : _ENDPOINT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.EndPoint)
+  })
+_sym_db.RegisterMessage(EndPoint)
+
+ConfigRule = _reflection.GeneratedProtocolMessageType('ConfigRule', (_message.Message,), {
+  'DESCRIPTOR' : _CONFIGRULE,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ConfigRule)
+  })
+_sym_db.RegisterMessage(ConfigRule)
+
+Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.Constraint)
+  })
+_sym_db.RegisterMessage(Constraint)
+
+TeraFlowController = _reflection.GeneratedProtocolMessageType('TeraFlowController', (_message.Message,), {
+  'DESCRIPTOR' : _TERAFLOWCONTROLLER,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TeraFlowController)
+  })
+_sym_db.RegisterMessage(TeraFlowController)
+
+AuthenticationResult = _reflection.GeneratedProtocolMessageType('AuthenticationResult', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHENTICATIONRESULT,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.AuthenticationResult)
+  })
+_sym_db.RegisterMessage(AuthenticationResult)
+
+
+
+_CONTEXTSERVICE = _descriptor.ServiceDescriptor(
+  name='ContextService',
+  full_name='context.ContextService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=5273,
+  serialized_end=7688,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='ListContextIds',
+    full_name='context.ContextService.ListContextIds',
+    index=0,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_CONTEXTIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListContexts',
+    full_name='context.ContextService.ListContexts',
+    index=1,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_CONTEXTLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetContext',
+    full_name='context.ContextService.GetContext',
+    index=2,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_CONTEXT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetContext',
+    full_name='context.ContextService.SetContext',
+    index=3,
+    containing_service=None,
+    input_type=_CONTEXT,
+    output_type=_CONTEXTID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveContext',
+    full_name='context.ContextService.RemoveContext',
+    index=4,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetContextEvents',
+    full_name='context.ContextService.GetContextEvents',
+    index=5,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_CONTEXTEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListTopologyIds',
+    full_name='context.ContextService.ListTopologyIds',
+    index=6,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_TOPOLOGYIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListTopologies',
+    full_name='context.ContextService.ListTopologies',
+    index=7,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_TOPOLOGYLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetTopology',
+    full_name='context.ContextService.GetTopology',
+    index=8,
+    containing_service=None,
+    input_type=_TOPOLOGYID,
+    output_type=_TOPOLOGY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetTopology',
+    full_name='context.ContextService.SetTopology',
+    index=9,
+    containing_service=None,
+    input_type=_TOPOLOGY,
+    output_type=_TOPOLOGYID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveTopology',
+    full_name='context.ContextService.RemoveTopology',
+    index=10,
+    containing_service=None,
+    input_type=_TOPOLOGYID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetTopologyEvents',
+    full_name='context.ContextService.GetTopologyEvents',
+    index=11,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_TOPOLOGYEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListDeviceIds',
+    full_name='context.ContextService.ListDeviceIds',
+    index=12,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_DEVICEIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListDevices',
+    full_name='context.ContextService.ListDevices',
+    index=13,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_DEVICELIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetDevice',
+    full_name='context.ContextService.GetDevice',
+    index=14,
+    containing_service=None,
+    input_type=_DEVICEID,
+    output_type=_DEVICE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetDevice',
+    full_name='context.ContextService.SetDevice',
+    index=15,
+    containing_service=None,
+    input_type=_DEVICE,
+    output_type=_DEVICEID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveDevice',
+    full_name='context.ContextService.RemoveDevice',
+    index=16,
+    containing_service=None,
+    input_type=_DEVICEID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetDeviceEvents',
+    full_name='context.ContextService.GetDeviceEvents',
+    index=17,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_DEVICEEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListLinkIds',
+    full_name='context.ContextService.ListLinkIds',
+    index=18,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_LINKIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListLinks',
+    full_name='context.ContextService.ListLinks',
+    index=19,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_LINKLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetLink',
+    full_name='context.ContextService.GetLink',
+    index=20,
+    containing_service=None,
+    input_type=_LINKID,
+    output_type=_LINK,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetLink',
+    full_name='context.ContextService.SetLink',
+    index=21,
+    containing_service=None,
+    input_type=_LINK,
+    output_type=_LINKID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveLink',
+    full_name='context.ContextService.RemoveLink',
+    index=22,
+    containing_service=None,
+    input_type=_LINKID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetLinkEvents',
+    full_name='context.ContextService.GetLinkEvents',
+    index=23,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_LINKEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListServiceIds',
+    full_name='context.ContextService.ListServiceIds',
+    index=24,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_SERVICEIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListServices',
+    full_name='context.ContextService.ListServices',
+    index=25,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_SERVICELIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetService',
+    full_name='context.ContextService.GetService',
+    index=26,
+    containing_service=None,
+    input_type=_SERVICEID,
+    output_type=_SERVICE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetService',
+    full_name='context.ContextService.SetService',
+    index=27,
+    containing_service=None,
+    input_type=_SERVICE,
+    output_type=_SERVICEID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveService',
+    full_name='context.ContextService.RemoveService',
+    index=28,
+    containing_service=None,
+    input_type=_SERVICEID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetServiceEvents',
+    full_name='context.ContextService.GetServiceEvents',
+    index=29,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_SERVICEEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListSliceIds',
+    full_name='context.ContextService.ListSliceIds',
+    index=30,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_SLICEIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListSlices',
+    full_name='context.ContextService.ListSlices',
+    index=31,
+    containing_service=None,
+    input_type=_CONTEXTID,
+    output_type=_SLICELIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSlice',
+    full_name='context.ContextService.GetSlice',
+    index=32,
+    containing_service=None,
+    input_type=_SLICEID,
+    output_type=_SLICE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetSlice',
+    full_name='context.ContextService.SetSlice',
+    index=33,
+    containing_service=None,
+    input_type=_SLICE,
+    output_type=_SLICEID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveSlice',
+    full_name='context.ContextService.RemoveSlice',
+    index=34,
+    containing_service=None,
+    input_type=_SLICEID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSliceEvents',
+    full_name='context.ContextService.GetSliceEvents',
+    index=35,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_SLICEEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListConnectionIds',
+    full_name='context.ContextService.ListConnectionIds',
+    index=36,
+    containing_service=None,
+    input_type=_SERVICEID,
+    output_type=_CONNECTIONIDLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListConnections',
+    full_name='context.ContextService.ListConnections',
+    index=37,
+    containing_service=None,
+    input_type=_SERVICEID,
+    output_type=_CONNECTIONLIST,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetConnection',
+    full_name='context.ContextService.GetConnection',
+    index=38,
+    containing_service=None,
+    input_type=_CONNECTIONID,
+    output_type=_CONNECTION,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetConnection',
+    full_name='context.ContextService.SetConnection',
+    index=39,
+    containing_service=None,
+    input_type=_CONNECTION,
+    output_type=_CONNECTIONID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveConnection',
+    full_name='context.ContextService.RemoveConnection',
+    index=40,
+    containing_service=None,
+    input_type=_CONNECTIONID,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetConnectionEvents',
+    full_name='context.ContextService.GetConnectionEvents',
+    index=41,
+    containing_service=None,
+    input_type=_EMPTY,
+    output_type=_CONNECTIONEVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CONTEXTSERVICE)
+
+DESCRIPTOR.services_by_name['ContextService'] = _CONTEXTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/src/pathcomp/proto/kpi_sample_types_pb2.py b/src/pathcomp/proto/kpi_sample_types_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea7fd2f82757d4c3db02d7e2c7817e2787b0b490
--- /dev/null
+++ b/src/pathcomp/proto/kpi_sample_types_pb2.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: kpi_sample_types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='kpi_sample_types.proto',
+  package='kpi_sample_types',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x16kpi_sample_types.proto\x12\x10kpi_sample_types*\xbe\x01\n\rKpiSampleType\x12\x19\n\x15KPISAMPLETYPE_UNKNOWN\x10\x00\x12%\n!KPISAMPLETYPE_PACKETS_TRANSMITTED\x10\x65\x12\"\n\x1eKPISAMPLETYPE_PACKETS_RECEIVED\x10\x66\x12$\n\x1fKPISAMPLETYPE_BYTES_TRANSMITTED\x10\xc9\x01\x12!\n\x1cKPISAMPLETYPE_BYTES_RECEIVED\x10\xca\x01\x62\x06proto3'
+)
+
+_KPISAMPLETYPE = _descriptor.EnumDescriptor(
+  name='KpiSampleType',
+  full_name='kpi_sample_types.KpiSampleType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='KPISAMPLETYPE_UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KPISAMPLETYPE_PACKETS_TRANSMITTED', index=1, number=101,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KPISAMPLETYPE_PACKETS_RECEIVED', index=2, number=102,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KPISAMPLETYPE_BYTES_TRANSMITTED', index=3, number=201,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KPISAMPLETYPE_BYTES_RECEIVED', index=4, number=202,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=45,
+  serialized_end=235,
+)
+_sym_db.RegisterEnumDescriptor(_KPISAMPLETYPE)
+
+KpiSampleType = enum_type_wrapper.EnumTypeWrapper(_KPISAMPLETYPE)
+KPISAMPLETYPE_UNKNOWN = 0
+KPISAMPLETYPE_PACKETS_TRANSMITTED = 101
+KPISAMPLETYPE_PACKETS_RECEIVED = 102
+KPISAMPLETYPE_BYTES_TRANSMITTED = 201
+KPISAMPLETYPE_BYTES_RECEIVED = 202
+
+
+DESCRIPTOR.enum_types_by_name['KpiSampleType'] = _KPISAMPLETYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/src/pathcomp/proto/pathcomp_pb2.py b/src/pathcomp/proto/pathcomp_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..bae04a93e1554f2db743c8a9d3c753fcb878fff6
--- /dev/null
+++ b/src/pathcomp/proto/pathcomp_pb2.py
@@ -0,0 +1,148 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: pathcomp.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from . import context_pb2 as context__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='pathcomp.proto',
+  package='pathcomp',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x0epathcomp.proto\x12\x08pathcomp\x1a\rcontext.proto\"5\n\x0fPathCompRequest\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\"]\n\rPathCompReply\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\x12(\n\x0b\x63onnections\x18\x02 \x03(\x0b\x32\x13.context.Connection2R\n\x0fPathCompService\x12?\n\x07\x43ompute\x12\x19.pathcomp.PathCompRequest\x1a\x17.pathcomp.PathCompReply\"\x00\x62\x06proto3'
+  ,
+  dependencies=[context__pb2.DESCRIPTOR,])
+
+
+
+
+_PATHCOMPREQUEST = _descriptor.Descriptor(
+  name='PathCompRequest',
+  full_name='pathcomp.PathCompRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='services', full_name='pathcomp.PathCompRequest.services', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=43,
+  serialized_end=96,
+)
+
+
+_PATHCOMPREPLY = _descriptor.Descriptor(
+  name='PathCompReply',
+  full_name='pathcomp.PathCompReply',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='services', full_name='pathcomp.PathCompReply.services', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='connections', full_name='pathcomp.PathCompReply.connections', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=98,
+  serialized_end=191,
+)
+
+_PATHCOMPREQUEST.fields_by_name['services'].message_type = context__pb2._SERVICE
+_PATHCOMPREPLY.fields_by_name['services'].message_type = context__pb2._SERVICE
+_PATHCOMPREPLY.fields_by_name['connections'].message_type = context__pb2._CONNECTION
+DESCRIPTOR.message_types_by_name['PathCompRequest'] = _PATHCOMPREQUEST
+DESCRIPTOR.message_types_by_name['PathCompReply'] = _PATHCOMPREPLY
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+PathCompRequest = _reflection.GeneratedProtocolMessageType('PathCompRequest', (_message.Message,), {
+  'DESCRIPTOR' : _PATHCOMPREQUEST,
+  '__module__' : 'pathcomp_pb2'
+  # @@protoc_insertion_point(class_scope:pathcomp.PathCompRequest)
+  })
+_sym_db.RegisterMessage(PathCompRequest)
+
+PathCompReply = _reflection.GeneratedProtocolMessageType('PathCompReply', (_message.Message,), {
+  'DESCRIPTOR' : _PATHCOMPREPLY,
+  '__module__' : 'pathcomp_pb2'
+  # @@protoc_insertion_point(class_scope:pathcomp.PathCompReply)
+  })
+_sym_db.RegisterMessage(PathCompReply)
+
+
+
+_PATHCOMPSERVICE = _descriptor.ServiceDescriptor(
+  name='PathCompService',
+  full_name='pathcomp.PathCompService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=193,
+  serialized_end=275,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Compute',
+    full_name='pathcomp.PathCompService.Compute',
+    index=0,
+    containing_service=None,
+    input_type=_PATHCOMPREQUEST,
+    output_type=_PATHCOMPREPLY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_PATHCOMPSERVICE)
+
+DESCRIPTOR.services_by_name['PathCompService'] = _PATHCOMPSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/src/pathcomp/proto/pathcomp_pb2_grpc.py b/src/pathcomp/proto/pathcomp_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..86ff7a3fb9fa1ca88d4edc8d688b8a3e6f0bd061
--- /dev/null
+++ b/src/pathcomp/proto/pathcomp_pb2_grpc.py
@@ -0,0 +1,66 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from . import pathcomp_pb2 as pathcomp__pb2
+
+
+class PathCompServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Compute = channel.unary_unary(
+                '/pathcomp.PathCompService/Compute',
+                request_serializer=pathcomp__pb2.PathCompRequest.SerializeToString,
+                response_deserializer=pathcomp__pb2.PathCompReply.FromString,
+                )
+
+
+class PathCompServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Compute(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_PathCompServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Compute': grpc.unary_unary_rpc_method_handler(
+                    servicer.Compute,
+                    request_deserializer=pathcomp__pb2.PathCompRequest.FromString,
+                    response_serializer=pathcomp__pb2.PathCompReply.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'pathcomp.PathCompService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class PathCompService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Compute(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/pathcomp.PathCompService/Compute',
+            pathcomp__pb2.PathCompRequest.SerializeToString,
+            pathcomp__pb2.PathCompReply.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/src/pathcomp/requirements.in b/src/pathcomp/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..f6cd8ce4034ef3ce2def2ea19706824c2dcfe8f2
--- /dev/null
+++ b/src/pathcomp/requirements.in
@@ -0,0 +1,9 @@
+grpcio==1.43.0
+grpcio-health-checking==1.43.0
+prometheus-client==0.13.0
+protobuf==3.19.3
+pytest==6.2.5
+pytest-benchmark==3.4.1
+python-json-logger==2.0.2
+requests==2.27.1
+coverage==6.3
diff --git a/src/pathcomp/service/PathCompService.py b/src/pathcomp/service/PathCompService.py
new file mode 100644
index 0000000000000000000000000000000000000000..7fd9eab3ba8de53ddc5fdee018519126c44361f0
--- /dev/null
+++ b/src/pathcomp/service/PathCompService.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.
+
+from common.Constants import ServiceNameEnum
+from common.Settings import get_service_port_grpc
+from common.tools.service.GenericGrpcService import GenericGrpcService
+from pathcomp.proto.pathcomp_pb2_grpc import add_PathCompServiceServicer_to_server
+from .PathCompServiceServicerImpl import PathCompServiceServicerImpl
+
+class PathCompService(GenericGrpcService):
+    def __init__(self, cls_name: str = __name__) -> None:
+        port = get_service_port_grpc(ServiceNameEnum.PATHCOMP)
+        super().__init__(port, cls_name=cls_name)
+        self.pathcomp_servicer = PathCompServiceServicerImpl()
+
+    def install_servicers(self):
+        add_PathCompServiceServicer_to_server(self.pathcomp_servicer, self.server)
diff --git a/src/pathcomp/service/PathCompServiceServicerImpl.py b/src/pathcomp/service/PathCompServiceServicerImpl.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1c7251508ea767a38d3102cca8f4edd50cf9170
--- /dev/null
+++ b/src/pathcomp/service/PathCompServiceServicerImpl.py
@@ -0,0 +1,85 @@
+# 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 List
+import grpc, logging, uuid
+from common.rpc_method_wrapper.Decorator import create_metrics, safe_and_metered_rpc_method
+from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string
+from context.client.ContextClient import ContextClient
+from context.proto.context_pb2 import Connection, Empty, EndPointId
+from pathcomp.proto.pathcomp_pb2 import PathCompReply, PathCompRequest
+from pathcomp.proto.pathcomp_pb2_grpc import PathCompServiceServicer
+
+LOGGER = logging.getLogger(__name__)
+
+SERVICE_NAME = 'PathComp'
+METHOD_NAMES = ['Compute']
+METRICS = create_metrics(SERVICE_NAME, METHOD_NAMES)
+
+class PathCompServiceServicerImpl(PathCompServiceServicer):
+    def __init__(self) -> None:
+        LOGGER.debug('Creating Servicer...')
+        LOGGER.debug('Servicer Created')
+
+    @safe_and_metered_rpc_method(METRICS, LOGGER)
+    def Compute(self, request : PathCompRequest, context : grpc.ServicerContext) -> PathCompReply:
+        LOGGER.info('[Compute] begin ; request = {:s}'.format(grpc_message_to_json_string(request)))
+
+        context_client = ContextClient()
+
+        # TODO: consider filtering resources
+
+        grpc_contexts = context_client.ListContexts(Empty())
+        grpc_devices = context_client.ListDevices(Empty())
+        grpc_links = context_client.ListLinks(Empty())
+        for grpc_context in grpc_contexts.contexts:
+            # TODO: add context to request
+            grpc_topologies = context_client.ListTopologies(grpc_context.context_id)
+            for grpc_topology in grpc_topologies.topologies:    #pylint: disable=unused-variable
+                # TODO: add topology to request
+                pass
+        for grpc_device in grpc_devices.devices:                #pylint: disable=unused-variable
+            # TODO: add device to request
+            pass
+        for grpc_link in grpc_links.links:                      #pylint: disable=unused-variable
+            # TODO: add link to request
+            pass
+
+        reply = PathCompReply()
+        # TODO: issue path computation request
+        # TODO: compose reply populating reply.services and reply.connections
+
+        for service in request.services:
+            # TODO: implement support for multi-point services
+            service_endpoint_ids = service.service_endpoint_ids
+            if len(service_endpoint_ids) != 2: raise NotImplementedError('Service must have 2 endpoints')
+            a_endpoint_id, z_endpoint_id = service_endpoint_ids[0], service_endpoint_ids[-1]
+
+            connection_uuid = str(uuid.uuid4())
+            connection_path_hops : List[EndPointId] = []
+            connection_path_hops.extend([
+                grpc_message_to_json(a_endpoint_id),
+                grpc_message_to_json(z_endpoint_id),
+            ])
+            connection = Connection(**{
+                'connection_id': {'connection_uuid': {'uuid': connection_uuid}},
+                'service_id': grpc_message_to_json(service.service_id),
+                'path_hops_endpoint_ids': connection_path_hops,
+                'sub_service_ids': [],
+            })
+            reply.connections.append(connection)    #pylint: disable=no-member
+            reply.services.append(service)          #pylint: disable=no-member
+
+        LOGGER.info('[Compute] end ; reply = {:s}'.format(grpc_message_to_json_string(reply)))
+        return reply
diff --git a/src/pathcomp/service/__init__.py b/src/pathcomp/service/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/pathcomp/service/__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/pathcomp/service/__main__.py b/src/pathcomp/service/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..a41b9e994f02db725c4adf371d9638fd5135693e
--- /dev/null
+++ b/src/pathcomp/service/__main__.py
@@ -0,0 +1,65 @@
+# 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, signal, sys, threading
+from prometheus_client import start_http_server
+from common.Constants import ServiceNameEnum
+from common.Settings import (
+    ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port,
+    wait_for_environment_variables)
+from .PathCompService import PathCompService
+
+terminate = threading.Event()
+LOGGER : logging.Logger = None
+
+def signal_handler(signal, frame): # pylint: disable=redefined-outer-name
+    LOGGER.warning('Terminate signal received')
+    terminate.set()
+
+def main():
+    global LOGGER # pylint: disable=global-statement
+
+    log_level = get_log_level()
+    logging.basicConfig(level=log_level)
+    LOGGER = logging.getLogger(__name__)
+
+    wait_for_environment_variables([
+        get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST     ),
+        get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC),
+    ])
+
+    signal.signal(signal.SIGINT,  signal_handler)
+    signal.signal(signal.SIGTERM, signal_handler)
+
+    LOGGER.info('Starting...')
+
+    # Start metrics server
+    metrics_port = get_metrics_port()
+    start_http_server(metrics_port)
+
+    # Starting service service
+    grpc_service = PathCompService()
+    grpc_service.start()
+
+    # Wait for Ctrl+C or termination signal
+    while not terminate.wait(timeout=0.1): pass
+
+    LOGGER.info('Terminating...')
+    grpc_service.stop()
+
+    LOGGER.info('Bye')
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/src/pathcomp/tests/.gitignore b/src/pathcomp/tests/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..6b97d6fe3ad32f39097745229ab7f547f26ecb12
--- /dev/null
+++ b/src/pathcomp/tests/.gitignore
@@ -0,0 +1 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
diff --git a/src/pathcomp/tests/MockService_Dependencies.py b/src/pathcomp/tests/MockService_Dependencies.py
new file mode 100644
index 0000000000000000000000000000000000000000..f390b26029309211629c7d8292838c105ad4bc05
--- /dev/null
+++ b/src/pathcomp/tests/MockService_Dependencies.py
@@ -0,0 +1,58 @@
+# 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 Union
+from common.Constants import ServiceNameEnum
+from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name
+from common.tests.MockServicerImpl_Context import MockServicerImpl_Context
+from common.tests.MockServicerImpl_Device import MockServicerImpl_Device
+from common.tests.MockServicerImpl_Service import MockServicerImpl_Service
+from common.tools.service.GenericGrpcService import GenericGrpcService
+from context.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
+from device.proto.device_pb2_grpc import add_DeviceServiceServicer_to_server
+from service.proto.service_pb2_grpc import add_ServiceServiceServicer_to_server
+
+LOCAL_HOST = '127.0.0.1'
+
+SERVICE_CONTEXT = ServiceNameEnum.CONTEXT
+SERVICE_DEVICE  = ServiceNameEnum.DEVICE
+SERVICE_SERVICE = ServiceNameEnum.SERVICE
+
+class MockService_Dependencies(GenericGrpcService):
+    # Mock Service implementing Context, Device, and Service to simplify unitary tests of PathComp
+
+    def __init__(self, bind_port: Union[str, int]) -> None:
+        super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService')
+
+    # pylint: disable=attribute-defined-outside-init
+    def install_servicers(self):
+        self.context_servicer = MockServicerImpl_Context()
+        add_ContextServiceServicer_to_server(self.context_servicer, self.server)
+
+        self.device_servicer = MockServicerImpl_Device()
+        add_DeviceServiceServicer_to_server(self.device_servicer, self.server)
+
+        self.service_servicer = MockServicerImpl_Service()
+        add_ServiceServiceServicer_to_server(self.service_servicer, self.server)
+
+    def configure_env_vars(self):
+        os.environ[get_env_var_name(SERVICE_CONTEXT, ENVVAR_SUFIX_SERVICE_HOST     )] = str(self.bind_address)
+        os.environ[get_env_var_name(SERVICE_CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(self.bind_port)
+
+        os.environ[get_env_var_name(SERVICE_DEVICE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(self.bind_address)
+        os.environ[get_env_var_name(SERVICE_DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(self.bind_port)
+
+        os.environ[get_env_var_name(SERVICE_SERVICE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(self.bind_address)
+        os.environ[get_env_var_name(SERVICE_SERVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(self.bind_port)
diff --git a/src/pathcomp/tests/Objects.py b/src/pathcomp/tests/Objects.py
new file mode 100644
index 0000000000000000000000000000000000000000..f4785d7ae670efcc5525d6b00c4baf3acf3f22b1
--- /dev/null
+++ b/src/pathcomp/tests/Objects.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.
+
+from common.Constants import DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID
+from common.tools.object_factory.Constraint import json_constraint
+from common.tools.object_factory.Context import json_context, json_context_id
+from common.tools.object_factory.Device import json_device_emulated_packet_router_disabled, json_device_id
+from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
+from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
+from common.tools.object_factory.Topology import json_topology, json_topology_id
+
+def compose_device(device_uuid, endpoint_uuids):
+    device_id = json_device_id(device_uuid)
+    endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    endpoints = json_endpoints(device_id, endpoints, topology_id=TOPOLOGY_A_ID)
+    device = json_device_emulated_packet_router_disabled(device_uuid, endpoints=endpoints)
+    return device_id, endpoints, device
+
+def compose_link(endpoint_a, endpoint_z):
+    link_uuid = get_link_uuid(endpoint_a['endpoint_id'], endpoint_z['endpoint_id'])
+    link_id   = json_link_id(link_uuid)
+    link      = json_link(link_uuid, [endpoint_a['endpoint_id'], endpoint_z['endpoint_id']])
+    return link_id, link
+
+def compose_service(endpoint_a, endpoint_z, constraints=[]):
+    service_uuid = get_service_uuid(endpoint_a['endpoint_id'], endpoint_z['endpoint_id'])
+    endpoint_ids = [endpoint_a['endpoint_id'], endpoint_z['endpoint_id']]
+    service = json_service_l3nm_planned(service_uuid, endpoint_ids=endpoint_ids, constraints=constraints)
+    return service
+
+# ----- Context --------------------------------------------------------------------------------------------------------
+CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_UUID)
+CONTEXT    = json_context(DEFAULT_CONTEXT_UUID)
+
+# ----- Domains --------------------------------------------------------------------------------------------------------
+TOPOLOGY_ADMIN_ID = json_topology_id(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
+TOPOLOGY_ADMIN    = json_topology(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
+
+TOPOLOGY_A_ID = json_topology_id('A', context_id=CONTEXT_ID)
+TOPOLOGY_A    = json_topology('A', context_id=CONTEXT_ID)
+
+TOPOLOGY_B_ID = json_topology_id('B', context_id=CONTEXT_ID)
+TOPOLOGY_B    = json_topology('B', context_id=CONTEXT_ID)
+
+TOPOLOGY_C_ID = json_topology_id('C', context_id=CONTEXT_ID)
+TOPOLOGY_C    = json_topology('C', context_id=CONTEXT_ID)
+
+# ----- Devices Domain A -----------------------------------------------------------------------------------------------
+DEVICE_A1_ID, DEVICE_A1_ENDPOINTS, DEVICE_A1 = compose_device('A1', ['1', '2', '2000'])
+DEVICE_A2_ID, DEVICE_A2_ENDPOINTS, DEVICE_A2 = compose_device('A2', ['1', '2', '1001'])
+DEVICE_A3_ID, DEVICE_A3_ENDPOINTS, DEVICE_A3 = compose_device('A3', ['1', '2'])
+
+# ----- Devices Domain B -----------------------------------------------------------------------------------------------
+DEVICE_B1_ID, DEVICE_B1_ENDPOINTS, DEVICE_B1 = compose_device('B1', ['1', '2', '2000'])
+DEVICE_B2_ID, DEVICE_B2_ENDPOINTS, DEVICE_B2 = compose_device('B2', ['1', '2', '1002'])
+DEVICE_B3_ID, DEVICE_B3_ENDPOINTS, DEVICE_B3 = compose_device('B3', ['1', '2'])
+
+# ----- Devices Domain C -----------------------------------------------------------------------------------------------
+DEVICE_C1_ID, DEVICE_C1_ENDPOINTS, DEVICE_C1 = compose_device('C1', ['1', '2', '1001'])
+DEVICE_C2_ID, DEVICE_C2_ENDPOINTS, DEVICE_C2 = compose_device('C2', ['1', '2'])
+DEVICE_C3_ID, DEVICE_C3_ENDPOINTS, DEVICE_C3 = compose_device('C3', ['1', '2', '1002'])
+
+# ----- InterDomain Links ----------------------------------------------------------------------------------------------
+LINK_A2_C3_ID, LINK_A2_C3 = compose_link(DEVICE_A2_ENDPOINTS[2], DEVICE_C3_ENDPOINTS[2])
+LINK_C1_B2_ID, LINK_C1_B2 = compose_link(DEVICE_C1_ENDPOINTS[2], DEVICE_B2_ENDPOINTS[2])
+
+# ----- IntraDomain A Links --------------------------------------------------------------------------------------------
+LINK_A1_A2_ID, LINK_A1_A2 = compose_link(DEVICE_A1_ENDPOINTS[0], DEVICE_A2_ENDPOINTS[0])
+LINK_A1_A3_ID, LINK_A1_A3 = compose_link(DEVICE_A1_ENDPOINTS[1], DEVICE_A3_ENDPOINTS[0])
+LINK_A2_A3_ID, LINK_A2_A3 = compose_link(DEVICE_A2_ENDPOINTS[1], DEVICE_A3_ENDPOINTS[1])
+
+# ----- IntraDomain B Links --------------------------------------------------------------------------------------------
+LINK_B1_B2_ID, LINK_B1_B2 = compose_link(DEVICE_B1_ENDPOINTS[0], DEVICE_B2_ENDPOINTS[0])
+LINK_B1_B3_ID, LINK_B1_B3 = compose_link(DEVICE_B1_ENDPOINTS[1], DEVICE_B3_ENDPOINTS[0])
+LINK_B2_B3_ID, LINK_B2_B3 = compose_link(DEVICE_B2_ENDPOINTS[1], DEVICE_B3_ENDPOINTS[1])
+
+# ----- IntraDomain C Links --------------------------------------------------------------------------------------------
+LINK_C1_C2_ID, LINK_C1_C2 = compose_link(DEVICE_C1_ENDPOINTS[0], DEVICE_C2_ENDPOINTS[0])
+LINK_C1_C3_ID, LINK_C1_C3 = compose_link(DEVICE_C1_ENDPOINTS[1], DEVICE_C3_ENDPOINTS[0])
+LINK_C2_C3_ID, LINK_C2_C3 = compose_link(DEVICE_C2_ENDPOINTS[1], DEVICE_C3_ENDPOINTS[1])
+
+# ----- Service --------------------------------------------------------------------------------------------------------
+SERVICE_A1_B1 = compose_service(DEVICE_A1_ENDPOINTS[2], DEVICE_B1_ENDPOINTS[2], constraints=[
+    json_constraint('bandwidth[gbps]', 10.0),
+    json_constraint('latency[ms]',      5.0),
+])
+
+# ----- Containers -----------------------------------------------------------------------------------------------------
+CONTEXTS   = [CONTEXT]
+TOPOLOGIES = [TOPOLOGY_ADMIN, TOPOLOGY_A, TOPOLOGY_B, TOPOLOGY_C]
+DEVICES    = [  DEVICE_A1, DEVICE_A2, DEVICE_A3,
+                DEVICE_B1, DEVICE_B2, DEVICE_B3,
+                DEVICE_C1, DEVICE_C2, DEVICE_C3,    ]
+LINKS      = [  LINK_A2_C3, LINK_C1_B2,
+                LINK_A1_A2, LINK_A1_A3, LINK_A2_A3,
+                LINK_B1_B2, LINK_B1_B3, LINK_B2_B3,
+                LINK_C1_C2, LINK_C1_C3, LINK_C2_C3, ]
+SERVICES   = [SERVICE_A1_B1]
diff --git a/src/pathcomp/tests/PrepareTestScenario.py b/src/pathcomp/tests/PrepareTestScenario.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4efcbdbfc0d311dfb120ab8124a9d2268660daf
--- /dev/null
+++ b/src/pathcomp/tests/PrepareTestScenario.py
@@ -0,0 +1,65 @@
+# 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, os
+from common.Constants import ServiceNameEnum
+from common.Settings import (
+    ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc)
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from pathcomp.client.PathCompClient import PathCompClient
+from pathcomp.service.PathCompService import PathCompService
+from pathcomp.tests.MockService_Dependencies import MockService_Dependencies
+
+LOCAL_HOST = '127.0.0.1'
+MOCKSERVICE_PORT = 10000
+PATHCOMP_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.PATHCOMP) # avoid privileged ports
+os.environ[get_env_var_name(ServiceNameEnum.PATHCOMP, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.PATHCOMP, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(PATHCOMP_SERVICE_PORT)
+
+@pytest.fixture(scope='session')
+def mock_service():
+    _service = MockService_Dependencies(MOCKSERVICE_PORT)
+    _service.configure_env_vars()
+    _service.start()
+    yield _service
+    _service.stop()
+
+@pytest.fixture(scope='session')
+def context_client(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name
+    _client = ContextClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def device_client(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name
+    _client = DeviceClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def pathcomp_service(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    _service = PathCompService()
+    _service.start()
+    yield _service
+    _service.stop()
+
+@pytest.fixture(scope='session')
+def pathcomp_client(pathcomp_service : PathCompService):    # pylint: disable=redefined-outer-name
+    _client = PathCompClient()
+    yield _client
+    _client.close()
diff --git a/src/pathcomp/tests/__init__.py b/src/pathcomp/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/pathcomp/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/pathcomp/tests/test_unitary.py b/src/pathcomp/tests/test_unitary.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e2dd8bbcc639e006a00ba96cd405570c7f66d16
--- /dev/null
+++ b/src/pathcomp/tests/test_unitary.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
+from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string
+from context.client.ContextClient import ContextClient
+from context.proto.context_pb2 import Context, ContextId, DeviceId, Link, LinkId, Topology, Device, TopologyId
+from device.client.DeviceClient import DeviceClient
+from pathcomp.client.PathCompClient import PathCompClient
+from pathcomp.proto.pathcomp_pb2 import PathCompRequest
+from .PrepareTestScenario import ( # pylint: disable=unused-import
+    # be careful, order of symbols is important here!
+    mock_service, pathcomp_service, context_client, device_client, pathcomp_client)
+from .Objects import CONTEXTS, DEVICES, LINKS, SERVICES, TOPOLOGIES
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+
+def test_prepare_environment(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    for context  in CONTEXTS  : context_client.SetContext (Context (**context ))
+    for topology in TOPOLOGIES: context_client.SetTopology(Topology(**topology))
+    for device   in DEVICES   : device_client .AddDevice  (Device  (**device  ))
+    for link     in LINKS     : context_client.SetLink    (Link    (**link    ))
+
+
+def test_request_service(
+    pathcomp_client : PathCompClient):  # pylint: disable=redefined-outer-name
+
+    request_services = SERVICES
+    pathcomp_request = PathCompRequest(services=request_services)
+    pathcomp_reply = pathcomp_client.Compute(pathcomp_request)
+    pathcomp_reply = grpc_message_to_json(pathcomp_reply)
+    reply_services = pathcomp_reply['services']
+    reply_connections = pathcomp_reply['connections']
+    assert len(request_services) <= len(reply_services)
+    request_service_ids = {
+        '{:s}/{:s}'.format(
+            svc['service_id']['context_id']['context_uuid']['uuid'],
+            svc['service_id']['service_uuid']['uuid']
+        )
+        for svc in request_services
+    }
+    reply_service_ids = {
+        '{:s}/{:s}'.format(
+            svc['service_id']['context_id']['context_uuid']['uuid'],
+            svc['service_id']['service_uuid']['uuid']
+        )
+        for svc in reply_services
+    }
+    # Assert all requested services have a reply
+    # It permits having other services not requested (i.e., sub-services)
+    assert len(request_service_ids.difference(reply_service_ids)) == 0
+
+    reply_connection_service_ids = {
+        '{:s}/{:s}'.format(
+            conn['service_id']['context_id']['context_uuid']['uuid'],
+            conn['service_id']['service_uuid']['uuid']
+        )
+        for conn in reply_connections
+    }
+    # Assert all requested services have a connection associated
+    # It permits having other connections not requested (i.e., connections for sub-services)
+    assert len(request_service_ids.difference(reply_connection_service_ids)) == 0
+
+    # TODO: implement other checks. examples:
+    # - request service and reply service endpoints match
+    # - request service and reply connection endpoints match
+    # - reply sub-service and reply sub-connection endpoints match
+    # - others?
+    #for json_service,json_connection in zip(json_services, json_connections):
+
+
+def test_cleanup_environment(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    for link     in LINKS     : context_client.RemoveLink    (LinkId    (**link    ['link_id'    ]))
+    for device   in DEVICES   : device_client .DeleteDevice  (DeviceId  (**device  ['device_id'  ]))
+    for topology in TOPOLOGIES: context_client.RemoveTopology(TopologyId(**topology['topology_id']))
+    for context  in CONTEXTS  : context_client.RemoveContext (ContextId (**context ['context_id' ]))
diff --git a/src/policy/pom.xml b/src/policy/pom.xml
index 6233d3edb8b1e66ef0e9dce27dfca0eb08359399..6b1d35bbe10b281b33dc8a0d6ec5900abae15c06 100644
--- a/src/policy/pom.xml
+++ b/src/policy/pom.xml
@@ -140,6 +140,12 @@
             <artifactId>quarkus-arc</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>31.1-jre</version>
+        </dependency>
+
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-config-yaml</artifactId>
diff --git a/src/policy/src/main/docker/Dockerfile.multistage.jvm b/src/policy/src/main/docker/Dockerfile.multistage.jvm
index e153b7d84c21a89276d2d3622ead316508b22cef..38920f65e01d8e466aed83bb5d55750253eb96f2 100644
--- a/src/policy/src/main/docker/Dockerfile.multistage.jvm
+++ b/src/policy/src/main/docker/Dockerfile.multistage.jvm
@@ -60,7 +60,7 @@ COPY --from=builder --chown=1001 /app/target/quarkus-app/app/ /deployments/app/
 COPY --from=builder --chown=1001 /app/target/quarkus-app/quarkus/ /deployments/quarkus/
 
 EXPOSE 8080
-EXPOSE 9999
+EXPOSE 6060
 USER 1001
 
 ENTRYPOINT [ "/deployments/run-java.sh" ]
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
index b95271708bf66833e09d9eed97b0b24ecfe09552..642fabcba92c82cab8cc0c43dca805aa95231df6 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
@@ -16,11 +16,18 @@
 
 package eu.teraflow.policy;
 
-import context.ContextOuterClass;
+import context.ContextOuterClass.ServiceId;
 import io.quarkus.grpc.GrpcService;
 import io.smallrye.mutiny.Uni;
 import javax.inject.Inject;
 import policy.Policy;
+import policy.Policy.PolicyRuleBasic;
+import policy.Policy.PolicyRuleDevice;
+import policy.Policy.PolicyRuleId;
+import policy.Policy.PolicyRuleService;
+import policy.Policy.PolicyRuleServiceList;
+import policy.Policy.PolicyRuleState;
+import policy.Policy.RuleState;
 
 @GrpcService
 public class PolicyGatewayImpl implements PolicyGateway {
@@ -33,50 +40,77 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
-    public Uni<Policy.PolicyRuleState> policyAdd(Policy.PolicyRule request) {
+    public Uni<PolicyRuleState> policyAddService(PolicyRuleService request) {
         return Uni.createFrom()
                 .item(
                         () ->
                                 Policy.PolicyRuleState.newBuilder()
-                                        .setPolicyRuleId(request.getPolicyRuleId().getUuid())
+                                        .setPolicyRuleState(
+                                                request.getPolicyRuleBasic().getPolicyRuleState().getPolicyRuleState())
                                         .build());
     }
 
     @Override
-    public Uni<Policy.PolicyRuleState> policyUpdate(Policy.PolicyRule request) {
+    public Uni<PolicyRuleState> policyAddDevice(PolicyRuleDevice request) {
         return Uni.createFrom()
                 .item(
                         () ->
                                 Policy.PolicyRuleState.newBuilder()
-                                        .setPolicyRuleId(request.getPolicyRuleId().getUuid())
+                                        .setPolicyRuleState(
+                                                request.getPolicyRuleBasic().getPolicyRuleState().getPolicyRuleState())
                                         .build());
     }
 
     @Override
-    public Uni<Policy.PolicyRuleState> policyDelete(Policy.PolicyRule request) {
+    public Uni<PolicyRuleState> policyUpdateService(PolicyRuleService request) {
         return Uni.createFrom()
                 .item(
                         () ->
                                 Policy.PolicyRuleState.newBuilder()
-                                        .setPolicyRuleId(request.getPolicyRuleId().getUuid())
+                                        .setPolicyRuleState(
+                                                request.getPolicyRuleBasic().getPolicyRuleState().getPolicyRuleState())
                                         .build());
     }
 
     @Override
-    public Uni<Policy.PolicyRule> getPolicy(Policy.PolicyRuleId request) {
+    public Uni<PolicyRuleState> policyUpdateDevice(PolicyRuleDevice request) {
         return Uni.createFrom()
-                .item(() -> Policy.PolicyRule.newBuilder().setPolicyRuleId(request).build());
+                .item(
+                        () ->
+                                Policy.PolicyRuleState.newBuilder()
+                                        .setPolicyRuleState(
+                                                request.getPolicyRuleBasic().getPolicyRuleState().getPolicyRuleState())
+                                        .build());
     }
 
     @Override
-    public Uni<Policy.PolicyRuleList> getPolicyByDeviceId(ContextOuterClass.DeviceId request) {
+    public Uni<PolicyRuleState> policyDelete(PolicyRuleId request) {
+        return Uni.createFrom()
+                .item(
+                        () ->
+                                Policy.PolicyRuleState.newBuilder()
+                                        .setPolicyRuleState(RuleState.POLICY_REMOVED)
+                                        .build());
+    }
+
+    @Override
+    public Uni<PolicyRuleService> getPolicyService(PolicyRuleId request) {
+        final var policyRuleBasic = PolicyRuleBasic.newBuilder().setPolicyRuleId(request).build();
 
-        return Uni.createFrom().item(() -> Policy.PolicyRuleList.newBuilder().build());
+        return Uni.createFrom()
+                .item(() -> PolicyRuleService.newBuilder().setPolicyRuleBasic(policyRuleBasic).build());
     }
 
     @Override
-    public Uni<Policy.PolicyRuleList> getPolicyByServiceId(ContextOuterClass.ServiceId request) {
+    public Uni<PolicyRuleDevice> getPolicyDevice(PolicyRuleId request) {
+        final var policyRuleBasic = PolicyRuleBasic.newBuilder().setPolicyRuleId(request).build();
 
-        return Uni.createFrom().item(() -> Policy.PolicyRuleList.newBuilder().build());
+        return Uni.createFrom()
+                .item(() -> PolicyRuleDevice.newBuilder().setPolicyRuleBasic(policyRuleBasic).build());
+    }
+
+    @Override
+    public Uni<PolicyRuleServiceList> getPolicyByServiceId(ServiceId request) {
+        return Uni.createFrom().item(() -> Policy.PolicyRuleServiceList.newBuilder().build());
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java
index d20775cc137240611b665c08adeaa725e15ad35e..14ffbb41ef60a438990bfe59e1d9539b48b51d75 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java
@@ -16,11 +16,14 @@
 
 package eu.teraflow.policy;
 
-import eu.teraflow.policy.model.PolicyRule;
 import eu.teraflow.policy.model.PolicyRuleState;
 import io.smallrye.mutiny.Uni;
+import policy.Policy.PolicyRuleDevice;
+import policy.Policy.PolicyRuleService;
 
 public interface PolicyService {
 
-    Uni<PolicyRuleState> addPolicy(PolicyRule policyRule);
+    Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService);
+
+    Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice);
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
index d8025d0809526934b4fa3959781ab88f5f10160a..c9645c5e30b1b4380bb9c0004a8b66f734f279d1 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
@@ -16,19 +16,25 @@
 
 package eu.teraflow.policy;
 
-import eu.teraflow.policy.model.PolicyRule;
 import eu.teraflow.policy.model.PolicyRuleState;
 import io.smallrye.mutiny.Uni;
 import javax.enterprise.context.ApplicationScoped;
 import org.jboss.logging.Logger;
+import policy.Policy.PolicyRuleDevice;
+import policy.Policy.PolicyRuleService;
 
 @ApplicationScoped
 public class PolicyServiceImpl implements PolicyService {
 
     private static final Logger LOGGER = Logger.getLogger(PolicyServiceImpl.class);
 
-    public Uni<PolicyRuleState> addPolicy(PolicyRule policyRule) {
+    @Override
+    public Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService) {
+        return null;
+    }
 
+    @Override
+    public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) {
         return null;
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/common/Util.java b/src/policy/src/main/java/eu/teraflow/policy/common/Util.java
new file mode 100644
index 0000000000000000000000000000000000000000..2fe37e47e806de047d53241bddead5b686bc5329
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/common/Util.java
@@ -0,0 +1,13 @@
+package eu.teraflow.policy.common;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Util {
+
+    private Util() {}
+
+    public static <T> String toString(List<T> list) {
+        return list.stream().map(T::toString).collect(Collectors.joining(", "));
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/Service.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/Service.java
index 5441a8cb0439ef6342cd805114ebb1aada27cd42..bbe684e1c79b67559ad0aa1e97059ef2852bbecf 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/Service.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/Service.java
@@ -16,8 +16,8 @@
 
 package eu.teraflow.policy.context.model;
 
+import eu.teraflow.policy.common.Util;
 import java.util.List;
-import java.util.stream.Collectors;
 
 public class Service {
 
@@ -74,13 +74,9 @@ public class Service {
                 getClass().getSimpleName(),
                 serviceId,
                 serviceType.toString(),
-                toString(serviceEndPointIds),
-                toString(serviceConstraints),
+                Util.toString(serviceEndPointIds),
+                Util.toString(serviceConstraints),
                 serviceStatus,
                 serviceConfig);
     }
-
-    private <T> String toString(List<T> list) {
-        return list.stream().map(T::toString).collect(Collectors.joining(", "));
-    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceConfig.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceConfig.java
index 22c8b3cb6674d4fa7647babb5e2ef8256bd8bd6c..e2e9c8e242f56602030e809de6edce67ee524281 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceConfig.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceConfig.java
@@ -16,8 +16,8 @@
 
 package eu.teraflow.policy.context.model;
 
+import eu.teraflow.policy.common.Util;
 import java.util.List;
-import java.util.stream.Collectors;
 
 public class ServiceConfig {
 
@@ -33,11 +33,6 @@ public class ServiceConfig {
 
     @Override
     public String toString() {
-        return String.format(
-                "%s:{configRules:[%s]}", getClass().getSimpleName(), toString(configRules));
-    }
-
-    private <T> String toString(List<T> list) {
-        return list.stream().map(T::toString).collect(Collectors.joining(", "));
+        return String.format("%s:{[%s]}", getClass().getSimpleName(), Util.toString(configRules));
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java
index b5466d1f3e3f645584df434d3076fe43f19ed823..e936f635c8f259d450b77588025e0b68e1ef7799 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java
@@ -30,6 +30,7 @@ public class ServiceStatus {
 
     @Override
     public String toString() {
-        return String.format("%s:{serviceStatus:\"%s\"}", getClass().getSimpleName(), status);
+        return String.format(
+                "%s:{serviceStatus:\"%s\"}", getClass().getSimpleName(), status.toString());
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java b/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
index 4de1743d0178d5f61737a2830b49370068156c8f..7231c02e5895ba08379abe39454259b79e1cc90a 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.model;
 
 public enum BooleanOperator {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java b/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
index ccd424a02ba771edc215ee92e7bfc0125a5b5c27..48029e550acf53f7b23816e3b2c409701ce03f30 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.model;
 
 public enum NumericalOperator {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
index 317daa02939bfe21c267b758999bae9d20f294af..7d9354a05ff42b556caefdcf635234d706da8352 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.model;
 
 public enum PolicyRuleActionEnum {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleBasic.java
similarity index 56%
rename from src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
rename to src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleBasic.java
index 18dbfa73d396770e71f0e1c864e2440f10b28a55..b32d3cf3008611ea67aee53f5234f1e45b98be8c 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleBasic.java
@@ -16,59 +16,58 @@
 
 package eu.teraflow.policy.model;
 
-import eu.teraflow.policy.context.model.ServiceId;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import eu.teraflow.policy.common.Util;
 import java.util.List;
-import java.util.stream.Collectors;
 
-public class PolicyRule {
+public class PolicyRuleBasic {
 
     private final String policyRuleId;
-    private final PolicyRuleType policyRuleType;
+    private final PolicyRuleState policyRuleState;
     private final int priority;
-    private final PolicyRuleEvent event;
     private final List<PolicyRuleCondition> policyRuleConditions;
     private final BooleanOperator booleanOperator;
     private final List<PolicyRuleAction> policyRuleActions;
-    private final ServiceId serviceId;
-    private final List<String> deviceIds;
 
-    public PolicyRule(
+    public PolicyRuleBasic(
             String policyRuleId,
-            PolicyRuleType policyRuleType,
+            PolicyRuleState policyRuleState,
             int priority,
-            PolicyRuleEvent event,
             List<PolicyRuleCondition> policyRuleConditions,
             BooleanOperator booleanOperator,
-            List<PolicyRuleAction> policyRuleActions,
-            ServiceId serviceId,
-            List<String> deviceIds) {
+            List<PolicyRuleAction> policyRuleActions) {
+        checkNotNull(policyRuleId, "Policy rule ID must not be null.");
+        checkArgument(!policyRuleId.isBlank(), "Policy rule ID must not be empty.");
         this.policyRuleId = policyRuleId;
-        this.policyRuleType = policyRuleType;
+        this.policyRuleState = policyRuleState;
+        checkArgument(priority >= 0, "Priority value must be greater or equal than zero.");
         this.priority = priority;
-        this.event = event;
+        checkNotNull(policyRuleConditions, "Policy Rule conditions cannot be null.");
+        checkArgument(!policyRuleConditions.isEmpty(), "Policy Rule conditions cannot be empty.");
         this.policyRuleConditions = policyRuleConditions;
+        checkArgument(
+                booleanOperator != BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED,
+                "Boolean operator cannot be undefined");
         this.booleanOperator = booleanOperator;
+        checkNotNull(policyRuleActions, "Policy Rule actions cannot be null.");
+        checkArgument(!policyRuleActions.isEmpty(), "Policy Rule actions cannot be empty.");
         this.policyRuleActions = policyRuleActions;
-        this.serviceId = serviceId;
-        this.deviceIds = deviceIds;
     }
 
     public String getPolicyRuleId() {
         return policyRuleId;
     }
 
-    public PolicyRuleType getPolicyRuleType() {
-        return policyRuleType;
+    public PolicyRuleState getPolicyRuleState() {
+        return policyRuleState;
     }
 
     public int getPriority() {
         return priority;
     }
 
-    public PolicyRuleEvent getEvent() {
-        return event;
-    }
-
     public List<PolicyRuleCondition> getPolicyRuleConditions() {
         return policyRuleConditions;
     }
@@ -81,31 +80,16 @@ public class PolicyRule {
         return policyRuleActions;
     }
 
-    public ServiceId getServiceId() {
-        return serviceId;
-    }
-
-    public List<String> getDeviceIds() {
-        return deviceIds;
-    }
-
     @Override
     public String toString() {
         return String.format(
-                "%s:{policyRuleId:\"%s\", policyRuleType:\"%s\", priority:%d, %s, [%s], booleanOperator:\"%s\", [%s], %s, [%s]}",
+                "%s:{policyRuleId:\"%s\", %s, priority:%d, [%s], booleanOperator:\"%s\", [%s]}",
                 getClass().getSimpleName(),
                 policyRuleId,
-                policyRuleType.toString(),
+                policyRuleState,
                 priority,
-                event,
-                toString(policyRuleConditions),
+                Util.toString(policyRuleConditions),
                 booleanOperator.toString(),
-                toString(policyRuleActions),
-                serviceId,
-                toString(deviceIds));
-    }
-
-    private <T> String toString(List<T> list) {
-        return list.stream().map(T::toString).collect(Collectors.joining(", "));
+                Util.toString(policyRuleActions));
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleDevice.java
similarity index 52%
rename from src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
rename to src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleDevice.java
index 412c6c7183250aae26de75a945bf57164634bc32..46151ea5c50f5b2f1b6542098594813e5cbc2a50 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleDevice.java
@@ -16,22 +16,30 @@
 
 package eu.teraflow.policy.model;
 
-import eu.teraflow.policy.context.model.Event;
+import eu.teraflow.policy.common.Util;
+import java.util.List;
 
-public class PolicyRuleEvent {
+public class PolicyRuleDevice {
 
-    private final Event event;
+    private final PolicyRuleBasic policyRuleBasic;
+    private final List<String> deviceIds;
 
-    public PolicyRuleEvent(Event event) {
-        this.event = event;
+    public PolicyRuleDevice(PolicyRuleBasic policyRuleBasic, List<String> deviceIds) {
+        this.policyRuleBasic = policyRuleBasic;
+        this.deviceIds = deviceIds;
     }
 
-    public Event getEvent() {
-        return event;
+    public PolicyRuleBasic getPolicyRuleBasic() {
+        return policyRuleBasic;
+    }
+
+    public List<String> getDeviceIds() {
+        return deviceIds;
     }
 
     @Override
     public String toString() {
-        return String.format("%s:{%s}", getClass().getSimpleName(), event);
+        return String.format(
+                "%s:{%s, [%s]}", getClass().getSimpleName(), policyRuleBasic, Util.toString(deviceIds));
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac0710d8590153ef8df1e9dbeb6465eac88c3fa1
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java
@@ -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.
+*/
+
+package eu.teraflow.policy.model;
+
+import eu.teraflow.policy.common.Util;
+import eu.teraflow.policy.context.model.ServiceId;
+import java.util.List;
+
+public class PolicyRuleService {
+
+    private final PolicyRuleBasic policyRuleBasic;
+    private final ServiceId serviceId;
+    private final List<String> deviceIds;
+
+    public PolicyRuleService(
+            PolicyRuleBasic policyRuleBasic, ServiceId serviceId, List<String> deviceIds) {
+        this.policyRuleBasic = policyRuleBasic;
+        this.serviceId = serviceId;
+        this.deviceIds = deviceIds;
+    }
+
+    public PolicyRuleBasic getPolicyRuleBasic() {
+        return policyRuleBasic;
+    }
+
+    public ServiceId getServiceId() {
+        return serviceId;
+    }
+
+    public List<String> getDeviceIds() {
+        return deviceIds;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{%s, %s, [%s]}",
+                getClass().getSimpleName(), policyRuleBasic, serviceId, Util.toString(deviceIds));
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java
index 38ee0a73b187420cfdd3f0bd7527d5196d7bad9f..566c3b785c05ed52060e907b7950dfa56b3452de 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java
@@ -18,26 +18,18 @@ package eu.teraflow.policy.model;
 
 public class PolicyRuleState {
 
-    private final String policeRuleId;
     private final RuleState ruleState;
 
-    public PolicyRuleState(String policeRuleId, RuleState ruleState) {
-        this.policeRuleId = policeRuleId;
+    public PolicyRuleState(RuleState ruleState) {
         this.ruleState = ruleState;
     }
 
-    public String getPolicyRuleId() {
-        return policeRuleId;
-    }
-
     public RuleState getRuleState() {
         return ruleState;
     }
 
     @Override
     public String toString() {
-        return String.format(
-                "%s:{policeRuleId:\"%s\", ruleState:\"%s\"}",
-                getClass().getSimpleName(), policeRuleId, ruleState);
+        return String.format("%s:{ruleState:\"%s\"}", getClass().getSimpleName(), ruleState.toString());
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
deleted file mode 100644
index 321220176adb7a336870b4845d3883e367c12078..0000000000000000000000000000000000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-* 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.
-*/
-
-package eu.teraflow.policy.model;
-
-public enum PolicyRuleType {
-    POLICYTYPE_DEVICE,
-    POLICYTYPE_NETWORK
-}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/RuleState.java b/src/policy/src/main/java/eu/teraflow/policy/model/RuleState.java
index 6c8aabdb04399176714f06e85b1a00d18e6e867d..2d01a6b94004158b6e2a4d06fead888ad54b76b1 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/RuleState.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/RuleState.java
@@ -17,7 +17,15 @@
 package eu.teraflow.policy.model;
 
 public enum RuleState {
-    POLICY_INACTIVE,
-    POLICY_PLANNED,
-    POLICY_ACTIVE
+    POLICY_UNDEFINED,
+    POLICY_FAILED,
+    POLICY_INSERTED,
+    POLICY_VALIDATED,
+    POLICY_PROVISIONED,
+    POLICY_ACTIVE,
+    POLICY_ENFORCED,
+    POLICY_INEFFECTIVE,
+    POLICY_EFFECTIVE,
+    POLICY_UPDATED,
+    POLICY_REMOVED
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/BooleanKpiValue.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/BooleanKpiValue.java
index aa2fe96cd4fdd96ea854de03bf7aea794fe4de00..07152f0e3d5cc0194a878e2c43639cfcfc120f2f 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/BooleanKpiValue.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/BooleanKpiValue.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.monitoring.model;
 
 public class BooleanKpiValue implements KpiValue<Boolean> {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/FloatKpiValue.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/FloatKpiValue.java
index d183c9c756f678a08c12669b27e46797eb745b51..93ffdf4fda7b29041991791bf231b10326574e95 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/FloatKpiValue.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/FloatKpiValue.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.monitoring.model;
 
 public class FloatKpiValue implements KpiValue<Float> {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/IntegerKpiValue.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/IntegerKpiValue.java
index b7048b188687657d3c6253d71cce32add4b80306..2161084d0fc722843cc20f928c24d9becc7f2a23 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/IntegerKpiValue.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/IntegerKpiValue.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.monitoring.model;
 
 public class IntegerKpiValue implements KpiValue<Integer> {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiValue.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiValue.java
index 4313c82698086dcf7b755ca522fbc6f952233423..5c3c4c3906dead563d19657c5a6da126e2aeb698 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiValue.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiValue.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.monitoring.model;
 
 public interface KpiValue<T> {
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/StringKpiValue.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/StringKpiValue.java
index fade272217208a44f70e0031fbf7c3bc54f1e196..52f26356fce02138f91e1bd4a889571a5d1a6e0c 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/StringKpiValue.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/StringKpiValue.java
@@ -1,3 +1,19 @@
+/*
+* 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.
+*/
+
 package eu.teraflow.policy.monitoring.model;
 
 public class StringKpiValue implements KpiValue<String> {
diff --git a/src/policy/src/main/resources/application.yml b/src/policy/src/main/resources/application.yml
index 2e09b2302d0311d06a36f3ee262e2a7a900c1ddc..3d992763422c9044136c38f21cf6d609281f86ca 100644
--- a/src/policy/src/main/resources/application.yml
+++ b/src/policy/src/main/resources/application.yml
@@ -17,8 +17,19 @@ quarkus:
     path: teraflow-policy-banner.txt
   grpc:
     server:
-      port: 9999
+      port: 6060
       enable-reflection-service: true
+    clients:
+      context:
+        host: ${quarkus.kubernetes.env.vars.context-service-host}
+        port: 1010
+      monitoring:
+        host: ${quarkus.kubernetes.env.vars.monitoring-service-host}
+        port: 7070
+      service:
+        host: ${quarkus.kubernetes.env.vars.service-service-host}
+        port: 3030
+
   http:
     port: 8080
 
@@ -43,6 +54,12 @@ quarkus:
       http:
         host-port: 8080
         container-port: 8080
-      grpc-server:
-        host-port: 9999
-        container-port: 9999
+      grpc:
+        host-port: 6060
+        container-port: 6060
+    env:
+      vars:
+        context-service-host: "contextservice"
+        monitoring-service-host: "monitoringservice"
+        service-service-host: "serviceservice"
+
diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..955ad2a62255155bee0ec7f8aa171d91410d8519
--- /dev/null
+++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
@@ -0,0 +1,359 @@
+/*
+* 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.
+*/
+
+package eu.teraflow.policy;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+import eu.teraflow.policy.model.BooleanOperator;
+import eu.teraflow.policy.model.NumericalOperator;
+import eu.teraflow.policy.model.PolicyRuleAction;
+import eu.teraflow.policy.model.PolicyRuleActionEnum;
+import eu.teraflow.policy.model.PolicyRuleBasic;
+import eu.teraflow.policy.model.PolicyRuleCondition;
+import eu.teraflow.policy.model.PolicyRuleState;
+import eu.teraflow.policy.model.RuleState;
+import eu.teraflow.policy.monitoring.model.IntegerKpiValue;
+import eu.teraflow.policy.monitoring.model.KpiValue;
+import io.quarkus.test.junit.QuarkusTest;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+class PolicyRuleBasicValidationTest {
+
+    private PolicyRuleBasic createPolicyRuleBasic(
+            String policyRuleId,
+            int priority,
+            PolicyRuleState policyRuleState,
+            BooleanOperator booleanOperator,
+            List<PolicyRuleCondition> policyRuleConditions,
+            List<PolicyRuleAction> policyRuleActions) {
+
+        return new PolicyRuleBasic(
+                policyRuleId,
+                policyRuleState,
+                priority,
+                policyRuleConditions,
+                booleanOperator,
+                policyRuleActions);
+    }
+
+    private List<PolicyRuleCondition> createPolicyRuleConditions(
+            String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) {
+        final var policyRuleCondition = new PolicyRuleCondition(kpiId, numericalOperator, kpiValue);
+
+        return List.of(policyRuleCondition);
+    }
+
+    private List<PolicyRuleAction> createPolicyRuleActions(
+            PolicyRuleActionEnum policyRuleActionEnum, List<String> parameters) {
+        final var policyRuleAction = new PolicyRuleAction(policyRuleActionEnum, parameters);
+
+        return List.of(policyRuleAction);
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenNullPolicyRuleId() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+
+        assertThatExceptionOfType(NullPointerException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        null,
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyRuleId() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_ENFORCED);
+
+        assertThatExceptionOfType(IllegalArgumentException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        "",
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenWhiteSpacedPolicyRuleId() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_ENFORCED);
+
+        assertThatExceptionOfType(IllegalArgumentException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        "  ",
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenNegativePriority() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_INSERTED);
+
+        final var policyRuleId = UUID.randomUUID().toString();
+
+        assertThatExceptionOfType(IllegalArgumentException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        policyRuleId,
+                                        -3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowNullPointerExceptionGivenNullPolicyRuleConditions() {
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_ENFORCED);
+
+        final var policyRuleId = UUID.randomUUID().toString();
+
+        assertThatExceptionOfType(NullPointerException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        policyRuleId,
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        null,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyRuleConditions() {
+        final var policyRuleConditions = Collections.<PolicyRuleCondition>emptyList();
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_REMOVED);
+
+        final var policyRuleId = UUID.randomUUID().toString();
+
+        assertThatExceptionOfType(IllegalArgumentException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        policyRuleId,
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenUndefinedBooleanOperator() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_VALIDATED);
+
+        final var policyRuleId = UUID.randomUUID().toString();
+
+        assertThatExceptionOfType(IllegalArgumentException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        policyRuleId,
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldThrowNullPointerExceptionGivenNullPolicyRuleActions() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        new IntegerKpiValue(3));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_PROVISIONED);
+
+        final var policyRuleId = UUID.randomUUID().toString();
+
+        assertThatExceptionOfType(NullPointerException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        policyRuleId,
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        null));
+    }
+
+    @Test
+    void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyPolicyRuleActions() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions = Collections.<PolicyRuleAction>emptyList();
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_FAILED);
+
+        final var policyRuleId = UUID.randomUUID().toString();
+
+        assertThatExceptionOfType(IllegalArgumentException.class)
+                .isThrownBy(
+                        () ->
+                                createPolicyRuleBasic(
+                                        policyRuleId,
+                                        3,
+                                        policyRuleState,
+                                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                                        policyRuleConditions,
+                                        policyRuleActions));
+    }
+
+    @Test
+    void shouldCreatePolicyRuleBasicObject() {
+        final var expectedPolicyRuleId = "expectedPolicyRuleId";
+        final var expectedPolicyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+        final var expectedPriority = 3;
+
+        final var firstKpiValue = new IntegerKpiValue(22);
+
+        final var firstExpectedPolicyRuleCondition =
+                new PolicyRuleCondition(
+                        "firstExpectedPolicyRuleConditionVariable",
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        firstKpiValue);
+
+        final var expectedPolicyRuleConditions = List.of(firstExpectedPolicyRuleCondition);
+
+        final var expectedBooleanOperator = BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR;
+
+        final var firstExpectedPolicyRuleAction =
+                new PolicyRuleAction(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS,
+                        List.of("parameter1", "parameter2"));
+
+        final var expectedPolicyRuleActions = List.of(firstExpectedPolicyRuleAction);
+
+        final var expectedPolicyRuleBasic =
+                new PolicyRuleBasic(
+                        expectedPolicyRuleId,
+                        expectedPolicyRuleState,
+                        expectedPriority,
+                        expectedPolicyRuleConditions,
+                        expectedBooleanOperator,
+                        expectedPolicyRuleActions);
+
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        "firstExpectedPolicyRuleConditionVariable",
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        new IntegerKpiValue(22));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS,
+                        List.of("parameter1", "parameter2"));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+
+        final var policyRuleBasic =
+                createPolicyRuleBasic(
+                        "expectedPolicyRuleId",
+                        3,
+                        policyRuleState,
+                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                        policyRuleConditions,
+                        policyRuleActions);
+
+        assertThat(policyRuleBasic).usingRecursiveComparison().isEqualTo(expectedPolicyRuleBasic);
+    }
+}
diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java
index 47a5502d15bb06c5851a01693e469a9c88588bfe..bf1af532f06accf9c0410548ad7f4aa85757dbb1 100644
--- a/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java
+++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java
@@ -29,6 +29,8 @@ import java.util.concurrent.TimeoutException;
 import org.jboss.logging.Logger;
 import org.junit.jupiter.api.Test;
 import policy.Policy;
+import policy.Policy.PolicyRuleBasic;
+import policy.Policy.RuleState;
 import policy.PolicyService;
 
 @QuarkusTest
@@ -38,47 +40,89 @@ class PolicyServiceTest {
     @GrpcClient PolicyService client;
 
     @Test
-    void shouldAddPolicy() throws ExecutionException, InterruptedException, TimeoutException {
+    void shouldAddPolicyService() throws ExecutionException, InterruptedException, TimeoutException {
         CompletableFuture<String> message = new CompletableFuture<>();
 
-        final var uuid =
-                ContextOuterClass.Uuid.newBuilder()
-                        .setUuid(UUID.fromString("0f14d0ab-9608-7862-a9e4-5ed26688389b").toString())
-                        .build();
-        final var policyRuleId = Policy.PolicyRuleId.newBuilder().setUuid(uuid).build();
-        final var policyRule = Policy.PolicyRule.newBuilder().setPolicyRuleId(policyRuleId).build();
+        final var expectedPolicyRuleState =
+                Policy.PolicyRuleState.newBuilder().setPolicyRuleState(RuleState.POLICY_ACTIVE).build();
+
+        final var policyRuleBasic =
+                PolicyRuleBasic.newBuilder().setPolicyRuleState(expectedPolicyRuleState).build();
+        final var policyRuleService =
+                Policy.PolicyRuleService.newBuilder().setPolicyRuleBasic(policyRuleBasic).build();
 
         client
-                .policyAdd(policyRule)
+                .policyAddService(policyRuleService)
                 .subscribe()
-                .with(
-                        policyRuleState -> {
-                            LOGGER.infof("Adding policy: %s", policyRuleState.getPolicyRuleId().getUuid());
-                            message.complete(policyRuleState.getPolicyRuleId().getUuid());
-                        });
-        assertThat(message.get(5, TimeUnit.SECONDS)).isEqualTo(policyRuleId.getUuid().getUuid());
+                .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString()));
+
+        assertThat(message.get(5, TimeUnit.SECONDS))
+                .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString());
     }
 
     @Test
-    void shouldUpdatePolicy() throws ExecutionException, InterruptedException, TimeoutException {
+    void shouldAddPolicyDevice() throws ExecutionException, InterruptedException, TimeoutException {
         CompletableFuture<String> message = new CompletableFuture<>();
 
-        final var uuid =
-                ContextOuterClass.Uuid.newBuilder()
-                        .setUuid(UUID.fromString("0f14d0ab-9608-7862-a9e4-5ed26688389b").toString())
-                        .build();
-        final var policyRuleId = Policy.PolicyRuleId.newBuilder().setUuid(uuid).build();
-        final var policyRule = Policy.PolicyRule.newBuilder().setPolicyRuleId(policyRuleId).build();
+        final var expectedPolicyRuleState =
+                Policy.PolicyRuleState.newBuilder().setPolicyRuleState(RuleState.POLICY_EFFECTIVE).build();
+
+        final var policyRuleBasic =
+                PolicyRuleBasic.newBuilder().setPolicyRuleState(expectedPolicyRuleState).build();
+        final var policyRuleDevice =
+                Policy.PolicyRuleDevice.newBuilder().setPolicyRuleBasic(policyRuleBasic).build();
 
         client
-                .policyUpdate(policyRule)
+                .policyAddDevice(policyRuleDevice)
                 .subscribe()
-                .with(
-                        policyRuleState -> {
-                            LOGGER.infof("Updating policy: %s", policyRuleState.getPolicyRuleId().getUuid());
-                            message.complete(policyRuleState.getPolicyRuleId().getUuid());
-                        });
-        assertThat(message.get(5, TimeUnit.SECONDS)).isEqualTo(policyRuleId.getUuid().getUuid());
+                .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString()));
+
+        assertThat(message.get(5, TimeUnit.SECONDS))
+                .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString());
+    }
+
+    @Test
+    void shouldUpdatePolicyService()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<String> message = new CompletableFuture<>();
+
+        final var expectedPolicyRuleState =
+                Policy.PolicyRuleState.newBuilder().setPolicyRuleState(RuleState.POLICY_ENFORCED).build();
+
+        final var policyRuleBasic =
+                PolicyRuleBasic.newBuilder().setPolicyRuleState(expectedPolicyRuleState).build();
+        final var policyRuleService =
+                Policy.PolicyRuleService.newBuilder().setPolicyRuleBasic(policyRuleBasic).build();
+
+        client
+                .policyUpdateService(policyRuleService)
+                .subscribe()
+                .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString()));
+
+        assertThat(message.get(5, TimeUnit.SECONDS))
+                .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString());
+    }
+
+    @Test
+    void shouldUpdatePolicyDevice()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<String> message = new CompletableFuture<>();
+
+        final var expectedPolicyRuleState =
+                Policy.PolicyRuleState.newBuilder().setPolicyRuleState(RuleState.POLICY_ENFORCED).build();
+
+        final var policyRuleBasic =
+                PolicyRuleBasic.newBuilder().setPolicyRuleState(expectedPolicyRuleState).build();
+        final var policyRuleDevice =
+                Policy.PolicyRuleDevice.newBuilder().setPolicyRuleBasic(policyRuleBasic).build();
+
+        client
+                .policyUpdateDevice(policyRuleDevice)
+                .subscribe()
+                .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString()));
+
+        assertThat(message.get(5, TimeUnit.SECONDS))
+                .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString());
     }
 
     @Test
@@ -90,21 +134,21 @@ class PolicyServiceTest {
                         .setUuid(UUID.fromString("0f14d0ab-9608-7862-a9e4-5ed26688389b").toString())
                         .build();
         final var policyRuleId = Policy.PolicyRuleId.newBuilder().setUuid(uuid).build();
-        final var policyRule = Policy.PolicyRule.newBuilder().setPolicyRuleId(policyRuleId).build();
+
+        final var expectedPolicyRuleState =
+                Policy.PolicyRuleState.newBuilder().setPolicyRuleState(RuleState.POLICY_REMOVED).build();
 
         client
-                .policyDelete(policyRule)
+                .policyDelete(policyRuleId)
                 .subscribe()
-                .with(
-                        policyRuleState -> {
-                            LOGGER.infof("Deleting policy: %s", policyRuleState.getPolicyRuleId().getUuid());
-                            message.complete(policyRuleState.getPolicyRuleId().getUuid());
-                        });
-        assertThat(message.get(5, TimeUnit.SECONDS)).isEqualTo(policyRuleId.getUuid().getUuid());
+                .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString()));
+
+        assertThat(message.get(5, TimeUnit.SECONDS))
+                .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString());
     }
 
     @Test
-    void shouldGetPolicy() throws ExecutionException, InterruptedException, TimeoutException {
+    void shouldGetPolicyService() throws ExecutionException, InterruptedException, TimeoutException {
         CompletableFuture<String> message = new CompletableFuture<>();
 
         final var uuid =
@@ -114,40 +158,43 @@ class PolicyServiceTest {
         final var policyRuleId = Policy.PolicyRuleId.newBuilder().setUuid(uuid).build();
 
         client
-                .getPolicy(policyRuleId)
+                .getPolicyService(policyRuleId)
                 .subscribe()
                 .with(
-                        policyRuleState -> {
+                        policyRuleService -> {
                             LOGGER.infof(
                                     "Getting policy with ID: %s",
-                                    policyRuleState.getPolicyRuleId().getUuid().getUuid());
-                            message.complete(policyRuleState.getPolicyRuleId().getUuid().getUuid());
+                                    policyRuleService.getPolicyRuleBasic().getPolicyRuleId().getUuid());
+                            message.complete(
+                                    policyRuleService.getPolicyRuleBasic().getPolicyRuleId().getUuid().getUuid());
                         });
+
         assertThat(message.get(5, TimeUnit.SECONDS)).isEqualTo(policyRuleId.getUuid().getUuid());
     }
 
     @Test
-    void shouldGetPolicyByDeviceId()
-            throws ExecutionException, InterruptedException, TimeoutException {
-
+    void shouldGetPolicyDevice() throws ExecutionException, InterruptedException, TimeoutException {
         CompletableFuture<String> message = new CompletableFuture<>();
 
         final var uuid =
                 ContextOuterClass.Uuid.newBuilder()
                         .setUuid(UUID.fromString("0f14d0ab-9608-7862-a9e4-5ed26688389b").toString())
                         .build();
-        final var deviceId = ContextOuterClass.DeviceId.newBuilder().setDeviceUuid(uuid).build();
+        final var policyRuleId = Policy.PolicyRuleId.newBuilder().setUuid(uuid).build();
 
         client
-                .getPolicyByDeviceId(deviceId)
+                .getPolicyDevice(policyRuleId)
                 .subscribe()
                 .with(
-                        policyRuleList -> {
-                            LOGGER.infof("Getting policyRuleList with ID: %s", policyRuleList);
-                            message.complete(policyRuleList.toString());
+                        policyRuleService -> {
+                            LOGGER.infof(
+                                    "Getting policy with ID: %s",
+                                    policyRuleService.getPolicyRuleBasic().getPolicyRuleId().getUuid());
+                            message.complete(
+                                    policyRuleService.getPolicyRuleBasic().getPolicyRuleId().getUuid().getUuid());
                         });
 
-        assertThat(message.get(5, TimeUnit.SECONDS)).isEmpty();
+        assertThat(message.get(5, TimeUnit.SECONDS)).isEqualTo(policyRuleId.getUuid().getUuid());
     }
 
     @Test
diff --git a/src/policy/target/generated-sources/grpc/policy/MutinyPolicyServiceGrpc.java b/src/policy/target/generated-sources/grpc/policy/MutinyPolicyServiceGrpc.java
index bad12a99d34a314f9c097ee7fda4ba7219dbb984..b9d840730272b2d6185cb2eba0c93e8cf4d11e6c 100644
--- a/src/policy/target/generated-sources/grpc/policy/MutinyPolicyServiceGrpc.java
+++ b/src/policy/target/generated-sources/grpc/policy/MutinyPolicyServiceGrpc.java
@@ -36,32 +36,42 @@ public final class MutinyPolicyServiceGrpc implements io.quarkus.grpc.runtime.Mu
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAdd(policy.Policy.PolicyRule request) {
-            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyAdd);
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddService(policy.Policy.PolicyRuleService request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyAddService);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdate(policy.Policy.PolicyRule request) {
-            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyUpdate);
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddDevice(policy.Policy.PolicyRuleDevice request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyAddDevice);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRule request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateService(policy.Policy.PolicyRuleService request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyUpdateService);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateDevice(policy.Policy.PolicyRuleDevice request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyUpdateDevice);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRuleId request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::policyDelete);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRule> getPolicy(policy.Policy.PolicyRuleId request) {
-            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getPolicy);
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleService> getPolicyService(policy.Policy.PolicyRuleId request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getPolicyService);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByDeviceId(context.ContextOuterClass.DeviceId request) {
-            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getPolicyByDeviceId);
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleDevice> getPolicyDevice(policy.Policy.PolicyRuleId request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getPolicyDevice);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleServiceList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getPolicyByServiceId);
         }
 
@@ -83,89 +93,115 @@ public final class MutinyPolicyServiceGrpc implements io.quarkus.grpc.runtime.Mu
 
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAdd(policy.Policy.PolicyRule request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddService(policy.Policy.PolicyRuleService request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddDevice(policy.Policy.PolicyRuleDevice request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateService(policy.Policy.PolicyRuleService request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdate(policy.Policy.PolicyRule request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateDevice(policy.Policy.PolicyRuleDevice request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRule request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRuleId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRule> getPolicy(policy.Policy.PolicyRuleId request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleService> getPolicyService(policy.Policy.PolicyRuleId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByDeviceId(context.ContextOuterClass.DeviceId request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleDevice> getPolicyDevice(policy.Policy.PolicyRuleId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         
-        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
+        public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleServiceList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
             return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
                     .addMethod(
-                            policy.PolicyServiceGrpc.getPolicyAddMethod(),
+                            policy.PolicyServiceGrpc.getPolicyAddServiceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            policy.Policy.PolicyRuleService,
+                                            policy.Policy.PolicyRuleState>(
+                                            this, METHODID_POLICY_ADD_SERVICE, compression)))
+                    .addMethod(
+                            policy.PolicyServiceGrpc.getPolicyAddDeviceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            policy.Policy.PolicyRuleDevice,
+                                            policy.Policy.PolicyRuleState>(
+                                            this, METHODID_POLICY_ADD_DEVICE, compression)))
+                    .addMethod(
+                            policy.PolicyServiceGrpc.getPolicyUpdateServiceMethod(),
                             asyncUnaryCall(
                                     new MethodHandlers<
-                                            policy.Policy.PolicyRule,
+                                            policy.Policy.PolicyRuleService,
                                             policy.Policy.PolicyRuleState>(
-                                            this, METHODID_POLICY_ADD, compression)))
+                                            this, METHODID_POLICY_UPDATE_SERVICE, compression)))
                     .addMethod(
-                            policy.PolicyServiceGrpc.getPolicyUpdateMethod(),
+                            policy.PolicyServiceGrpc.getPolicyUpdateDeviceMethod(),
                             asyncUnaryCall(
                                     new MethodHandlers<
-                                            policy.Policy.PolicyRule,
+                                            policy.Policy.PolicyRuleDevice,
                                             policy.Policy.PolicyRuleState>(
-                                            this, METHODID_POLICY_UPDATE, compression)))
+                                            this, METHODID_POLICY_UPDATE_DEVICE, compression)))
                     .addMethod(
                             policy.PolicyServiceGrpc.getPolicyDeleteMethod(),
                             asyncUnaryCall(
                                     new MethodHandlers<
-                                            policy.Policy.PolicyRule,
+                                            policy.Policy.PolicyRuleId,
                                             policy.Policy.PolicyRuleState>(
                                             this, METHODID_POLICY_DELETE, compression)))
                     .addMethod(
-                            policy.PolicyServiceGrpc.getGetPolicyMethod(),
+                            policy.PolicyServiceGrpc.getGetPolicyServiceMethod(),
                             asyncUnaryCall(
                                     new MethodHandlers<
                                             policy.Policy.PolicyRuleId,
-                                            policy.Policy.PolicyRule>(
-                                            this, METHODID_GET_POLICY, compression)))
+                                            policy.Policy.PolicyRuleService>(
+                                            this, METHODID_GET_POLICY_SERVICE, compression)))
                     .addMethod(
-                            policy.PolicyServiceGrpc.getGetPolicyByDeviceIdMethod(),
+                            policy.PolicyServiceGrpc.getGetPolicyDeviceMethod(),
                             asyncUnaryCall(
                                     new MethodHandlers<
-                                            context.ContextOuterClass.DeviceId,
-                                            policy.Policy.PolicyRuleList>(
-                                            this, METHODID_GET_POLICY_BY_DEVICE_ID, compression)))
+                                            policy.Policy.PolicyRuleId,
+                                            policy.Policy.PolicyRuleDevice>(
+                                            this, METHODID_GET_POLICY_DEVICE, compression)))
                     .addMethod(
                             policy.PolicyServiceGrpc.getGetPolicyByServiceIdMethod(),
                             asyncUnaryCall(
                                     new MethodHandlers<
                                             context.ContextOuterClass.ServiceId,
-                                            policy.Policy.PolicyRuleList>(
+                                            policy.Policy.PolicyRuleServiceList>(
                                             this, METHODID_GET_POLICY_BY_SERVICE_ID, compression)))
                     .build();
         }
     }
 
-    private static final int METHODID_POLICY_ADD = 0;
-    private static final int METHODID_POLICY_UPDATE = 1;
-    private static final int METHODID_POLICY_DELETE = 2;
-    private static final int METHODID_GET_POLICY = 3;
-    private static final int METHODID_GET_POLICY_BY_DEVICE_ID = 4;
-    private static final int METHODID_GET_POLICY_BY_SERVICE_ID = 5;
+    private static final int METHODID_POLICY_ADD_SERVICE = 0;
+    private static final int METHODID_POLICY_ADD_DEVICE = 1;
+    private static final int METHODID_POLICY_UPDATE_SERVICE = 2;
+    private static final int METHODID_POLICY_UPDATE_DEVICE = 3;
+    private static final int METHODID_POLICY_DELETE = 4;
+    private static final int METHODID_GET_POLICY_SERVICE = 5;
+    private static final int METHODID_GET_POLICY_DEVICE = 6;
+    private static final int METHODID_GET_POLICY_BY_SERVICE_ID = 7;
 
     private static final class MethodHandlers<Req, Resp> implements
             io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -186,39 +222,51 @@ public final class MutinyPolicyServiceGrpc implements io.quarkus.grpc.runtime.Mu
         @java.lang.SuppressWarnings("unchecked")
         public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
             switch (methodId) {
-                case METHODID_POLICY_ADD:
-                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRule) request,
+                case METHODID_POLICY_ADD_SERVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleService) request,
                             (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver,
                             compression,
-                            serviceImpl::policyAdd);
+                            serviceImpl::policyAddService);
                     break;
-                case METHODID_POLICY_UPDATE:
-                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRule) request,
+                case METHODID_POLICY_ADD_DEVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleDevice) request,
                             (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver,
                             compression,
-                            serviceImpl::policyUpdate);
+                            serviceImpl::policyAddDevice);
+                    break;
+                case METHODID_POLICY_UPDATE_SERVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleService) request,
+                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver,
+                            compression,
+                            serviceImpl::policyUpdateService);
+                    break;
+                case METHODID_POLICY_UPDATE_DEVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleDevice) request,
+                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver,
+                            compression,
+                            serviceImpl::policyUpdateDevice);
                     break;
                 case METHODID_POLICY_DELETE:
-                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRule) request,
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleId) request,
                             (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver,
                             compression,
                             serviceImpl::policyDelete);
                     break;
-                case METHODID_GET_POLICY:
+                case METHODID_GET_POLICY_SERVICE:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleId) request,
-                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRule>) responseObserver,
+                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleService>) responseObserver,
                             compression,
-                            serviceImpl::getPolicy);
+                            serviceImpl::getPolicyService);
                     break;
-                case METHODID_GET_POLICY_BY_DEVICE_ID:
-                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.DeviceId) request,
-                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList>) responseObserver,
+                case METHODID_GET_POLICY_DEVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((policy.Policy.PolicyRuleId) request,
+                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleDevice>) responseObserver,
                             compression,
-                            serviceImpl::getPolicyByDeviceId);
+                            serviceImpl::getPolicyDevice);
                     break;
                 case METHODID_GET_POLICY_BY_SERVICE_ID:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.ServiceId) request,
-                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList>) responseObserver,
+                            (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleServiceList>) responseObserver,
                             compression,
                             serviceImpl::getPolicyByServiceId);
                     break;
diff --git a/src/policy/target/generated-sources/grpc/policy/Policy.java b/src/policy/target/generated-sources/grpc/policy/Policy.java
index 78734473960668d0c7792df03104b91b5fabdbcb..324f67cddbb0acf4a0d1527c4f70055caa16e50c 100644
--- a/src/policy/target/generated-sources/grpc/policy/Policy.java
+++ b/src/policy/target/generated-sources/grpc/policy/Policy.java
@@ -21,180 +21,183 @@ public final class Policy {
       implements com.google.protobuf.ProtocolMessageEnum {
     /**
      * <pre>
-     * Rule is currently inactive
+     * Undefined rule state
      * </pre>
      *
-     * <code>POLICY_INACTIVE = 0;</code>
+     * <code>POLICY_UNDEFINED = 0;</code>
      */
-    POLICY_INACTIVE(0),
+    POLICY_UNDEFINED(0),
     /**
      * <pre>
-     * Rule installation planned
+     * Rule failed
      * </pre>
      *
-     * <code>POLICY_PLANNED = 1;</code>
+     * <code>POLICY_FAILED = 1;</code>
      */
-    POLICY_PLANNED(1),
+    POLICY_FAILED(1),
     /**
      * <pre>
-     * Rule is currently active
+     * Rule is just inserted
      * </pre>
      *
-     * <code>POLICY_ACTIVE = 2;</code>
+     * <code>POLICY_INSERTED = 2;</code>
      */
-    POLICY_ACTIVE(2),
-    UNRECOGNIZED(-1),
-    ;
-
+    POLICY_INSERTED(2),
     /**
      * <pre>
-     * Rule is currently inactive
+     * Rule content is correct
      * </pre>
      *
-     * <code>POLICY_INACTIVE = 0;</code>
+     * <code>POLICY_VALIDATED = 3;</code>
      */
-    public static final int POLICY_INACTIVE_VALUE = 0;
+    POLICY_VALIDATED(3),
     /**
      * <pre>
-     * Rule installation planned
+     * Rule subscribed to Monitoring
      * </pre>
      *
-     * <code>POLICY_PLANNED = 1;</code>
+     * <code>POLICY_PROVISIONED = 4;</code>
      */
-    public static final int POLICY_PLANNED_VALUE = 1;
+    POLICY_PROVISIONED(4),
     /**
      * <pre>
-     * Rule is currently active
+     * Rule is currently active (alarm is just thrown by Monitoring)
      * </pre>
      *
-     * <code>POLICY_ACTIVE = 2;</code>
+     * <code>POLICY_ACTIVE = 5;</code>
      */
-    public static final int POLICY_ACTIVE_VALUE = 2;
-
-
-    public final int getNumber() {
-      if (this == UNRECOGNIZED) {
-        throw new java.lang.IllegalArgumentException(
-            "Can't get the number of an unknown enum value.");
-      }
-      return value;
-    }
-
+    POLICY_ACTIVE(5),
     /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     * @deprecated Use {@link #forNumber(int)} instead.
+     * <pre>
+     * Rule action is successfully enforced
+     * </pre>
+     *
+     * <code>POLICY_ENFORCED = 6;</code>
      */
-    @java.lang.Deprecated
-    public static RuleState valueOf(int value) {
-      return forNumber(value);
-    }
-
+    POLICY_ENFORCED(6),
     /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
+     * <pre>
+     * The applied rule action did not work as expected
+     * </pre>
+     *
+     * <code>POLICY_INEFFECTIVE = 7;</code>
      */
-    public static RuleState forNumber(int value) {
-      switch (value) {
-        case 0: return POLICY_INACTIVE;
-        case 1: return POLICY_PLANNED;
-        case 2: return POLICY_ACTIVE;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<RuleState>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        RuleState> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<RuleState>() {
-            public RuleState findValueByNumber(int number) {
-              return RuleState.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      if (this == UNRECOGNIZED) {
-        throw new java.lang.IllegalStateException(
-            "Can't get the descriptor of an unrecognized enum value.");
-      }
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return policy.Policy.getDescriptor().getEnumTypes().get(0);
-    }
-
-    private static final RuleState[] VALUES = values();
-
-    public static RuleState valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      if (desc.getIndex() == -1) {
-        return UNRECOGNIZED;
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private RuleState(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:policy.RuleState)
-  }
-
-  /**
-   * Protobuf enum {@code policy.PolicyRuleType}
-   */
-  public enum PolicyRuleType
-      implements com.google.protobuf.ProtocolMessageEnum {
+    POLICY_INEFFECTIVE(7),
+    /**
+     * <pre>
+     * The applied rule action did work as expected
+     * </pre>
+     *
+     * <code>POLICY_EFFECTIVE = 8;</code>
+     */
+    POLICY_EFFECTIVE(8),
     /**
      * <pre>
-     * Device-level
+     * Operator requires a policy to change
      * </pre>
      *
-     * <code>POLICYTYPE_DEVICE = 0;</code>
+     * <code>POLICY_UPDATED = 9;</code>
      */
-    POLICYTYPE_DEVICE(0),
+    POLICY_UPDATED(9),
     /**
      * <pre>
-     * Network-wide
+     * Operator requires to remove a policy
      * </pre>
      *
-     * <code>POLICYTYPE_NETWORK = 1;</code>
+     * <code>POLICY_REMOVED = 10;</code>
      */
-    POLICYTYPE_NETWORK(1),
+    POLICY_REMOVED(10),
     UNRECOGNIZED(-1),
     ;
 
     /**
      * <pre>
-     * Device-level
+     * Undefined rule state
+     * </pre>
+     *
+     * <code>POLICY_UNDEFINED = 0;</code>
+     */
+    public static final int POLICY_UNDEFINED_VALUE = 0;
+    /**
+     * <pre>
+     * Rule failed
+     * </pre>
+     *
+     * <code>POLICY_FAILED = 1;</code>
+     */
+    public static final int POLICY_FAILED_VALUE = 1;
+    /**
+     * <pre>
+     * Rule is just inserted
+     * </pre>
+     *
+     * <code>POLICY_INSERTED = 2;</code>
+     */
+    public static final int POLICY_INSERTED_VALUE = 2;
+    /**
+     * <pre>
+     * Rule content is correct
+     * </pre>
+     *
+     * <code>POLICY_VALIDATED = 3;</code>
+     */
+    public static final int POLICY_VALIDATED_VALUE = 3;
+    /**
+     * <pre>
+     * Rule subscribed to Monitoring
+     * </pre>
+     *
+     * <code>POLICY_PROVISIONED = 4;</code>
+     */
+    public static final int POLICY_PROVISIONED_VALUE = 4;
+    /**
+     * <pre>
+     * Rule is currently active (alarm is just thrown by Monitoring)
+     * </pre>
+     *
+     * <code>POLICY_ACTIVE = 5;</code>
+     */
+    public static final int POLICY_ACTIVE_VALUE = 5;
+    /**
+     * <pre>
+     * Rule action is successfully enforced
+     * </pre>
+     *
+     * <code>POLICY_ENFORCED = 6;</code>
+     */
+    public static final int POLICY_ENFORCED_VALUE = 6;
+    /**
+     * <pre>
+     * The applied rule action did not work as expected
+     * </pre>
+     *
+     * <code>POLICY_INEFFECTIVE = 7;</code>
+     */
+    public static final int POLICY_INEFFECTIVE_VALUE = 7;
+    /**
+     * <pre>
+     * The applied rule action did work as expected
+     * </pre>
+     *
+     * <code>POLICY_EFFECTIVE = 8;</code>
+     */
+    public static final int POLICY_EFFECTIVE_VALUE = 8;
+    /**
+     * <pre>
+     * Operator requires a policy to change
      * </pre>
      *
-     * <code>POLICYTYPE_DEVICE = 0;</code>
+     * <code>POLICY_UPDATED = 9;</code>
      */
-    public static final int POLICYTYPE_DEVICE_VALUE = 0;
+    public static final int POLICY_UPDATED_VALUE = 9;
     /**
      * <pre>
-     * Network-wide
+     * Operator requires to remove a policy
      * </pre>
      *
-     * <code>POLICYTYPE_NETWORK = 1;</code>
+     * <code>POLICY_REMOVED = 10;</code>
      */
-    public static final int POLICYTYPE_NETWORK_VALUE = 1;
+    public static final int POLICY_REMOVED_VALUE = 10;
 
 
     public final int getNumber() {
@@ -211,7 +214,7 @@ public final class Policy {
      * @deprecated Use {@link #forNumber(int)} instead.
      */
     @java.lang.Deprecated
-    public static PolicyRuleType valueOf(int value) {
+    public static RuleState valueOf(int value) {
       return forNumber(value);
     }
 
@@ -219,23 +222,32 @@ public final class Policy {
      * @param value The numeric wire value of the corresponding enum entry.
      * @return The enum associated with the given numeric wire value.
      */
-    public static PolicyRuleType forNumber(int value) {
+    public static RuleState forNumber(int value) {
       switch (value) {
-        case 0: return POLICYTYPE_DEVICE;
-        case 1: return POLICYTYPE_NETWORK;
+        case 0: return POLICY_UNDEFINED;
+        case 1: return POLICY_FAILED;
+        case 2: return POLICY_INSERTED;
+        case 3: return POLICY_VALIDATED;
+        case 4: return POLICY_PROVISIONED;
+        case 5: return POLICY_ACTIVE;
+        case 6: return POLICY_ENFORCED;
+        case 7: return POLICY_INEFFECTIVE;
+        case 8: return POLICY_EFFECTIVE;
+        case 9: return POLICY_UPDATED;
+        case 10: return POLICY_REMOVED;
         default: return null;
       }
     }
 
-    public static com.google.protobuf.Internal.EnumLiteMap<PolicyRuleType>
+    public static com.google.protobuf.Internal.EnumLiteMap<RuleState>
         internalGetValueMap() {
       return internalValueMap;
     }
     private static final com.google.protobuf.Internal.EnumLiteMap<
-        PolicyRuleType> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<PolicyRuleType>() {
-            public PolicyRuleType findValueByNumber(int number) {
-              return PolicyRuleType.forNumber(number);
+        RuleState> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<RuleState>() {
+            public RuleState findValueByNumber(int number) {
+              return RuleState.forNumber(number);
             }
           };
 
@@ -253,12 +265,12 @@ public final class Policy {
     }
     public static final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptor() {
-      return policy.Policy.getDescriptor().getEnumTypes().get(1);
+      return policy.Policy.getDescriptor().getEnumTypes().get(0);
     }
 
-    private static final PolicyRuleType[] VALUES = values();
+    private static final RuleState[] VALUES = values();
 
-    public static PolicyRuleType valueOf(
+    public static RuleState valueOf(
         com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
       if (desc.getType() != getDescriptor()) {
         throw new java.lang.IllegalArgumentException(
@@ -272,11 +284,11 @@ public final class Policy {
 
     private final int value;
 
-    private PolicyRuleType(int value) {
+    private RuleState(int value) {
       this.value = value;
     }
 
-    // @@protoc_insertion_point(enum_scope:policy.PolicyRuleType)
+    // @@protoc_insertion_point(enum_scope:policy.RuleState)
   }
 
   public interface PolicyRuleIdOrBuilder extends
@@ -905,27 +917,12 @@ public final class Policy {
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Uuid policyRuleId = 1;</code>
-     * @return Whether the policyRuleId field is set.
-     */
-    boolean hasPolicyRuleId();
-    /**
-     * <code>.context.Uuid policyRuleId = 1;</code>
-     * @return The policyRuleId.
-     */
-    context.ContextOuterClass.Uuid getPolicyRuleId();
-    /**
-     * <code>.context.Uuid policyRuleId = 1;</code>
-     */
-    context.ContextOuterClass.UuidOrBuilder getPolicyRuleIdOrBuilder();
-
-    /**
-     * <code>.policy.RuleState policyRuleState = 2;</code>
+     * <code>.policy.RuleState policyRuleState = 1;</code>
      * @return The enum numeric value on the wire for policyRuleState.
      */
     int getPolicyRuleStateValue();
     /**
-     * <code>.policy.RuleState policyRuleState = 2;</code>
+     * <code>.policy.RuleState policyRuleState = 1;</code>
      * @return The policyRuleState.
      */
     policy.Policy.RuleState getPolicyRuleState();
@@ -976,20 +973,7 @@ public final class Policy {
             case 0:
               done = true;
               break;
-            case 10: {
-              context.ContextOuterClass.Uuid.Builder subBuilder = null;
-              if (policyRuleId_ != null) {
-                subBuilder = policyRuleId_.toBuilder();
-              }
-              policyRuleId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(policyRuleId_);
-                policyRuleId_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 16: {
+            case 8: {
               int rawValue = input.readEnum();
 
               policyRuleState_ = rawValue;
@@ -1027,43 +1011,17 @@ public final class Policy {
               policy.Policy.PolicyRuleState.class, policy.Policy.PolicyRuleState.Builder.class);
     }
 
-    public static final int POLICYRULEID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Uuid policyRuleId_;
-    /**
-     * <code>.context.Uuid policyRuleId = 1;</code>
-     * @return Whether the policyRuleId field is set.
-     */
-    @java.lang.Override
-    public boolean hasPolicyRuleId() {
-      return policyRuleId_ != null;
-    }
-    /**
-     * <code>.context.Uuid policyRuleId = 1;</code>
-     * @return The policyRuleId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.Uuid getPolicyRuleId() {
-      return policyRuleId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleId_;
-    }
-    /**
-     * <code>.context.Uuid policyRuleId = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.UuidOrBuilder getPolicyRuleIdOrBuilder() {
-      return getPolicyRuleId();
-    }
-
-    public static final int POLICYRULESTATE_FIELD_NUMBER = 2;
+    public static final int POLICYRULESTATE_FIELD_NUMBER = 1;
     private int policyRuleState_;
     /**
-     * <code>.policy.RuleState policyRuleState = 2;</code>
+     * <code>.policy.RuleState policyRuleState = 1;</code>
      * @return The enum numeric value on the wire for policyRuleState.
      */
     @java.lang.Override public int getPolicyRuleStateValue() {
       return policyRuleState_;
     }
     /**
-     * <code>.policy.RuleState policyRuleState = 2;</code>
+     * <code>.policy.RuleState policyRuleState = 1;</code>
      * @return The policyRuleState.
      */
     @java.lang.Override public policy.Policy.RuleState getPolicyRuleState() {
@@ -1086,11 +1044,8 @@ public final class Policy {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (policyRuleId_ != null) {
-        output.writeMessage(1, getPolicyRuleId());
-      }
-      if (policyRuleState_ != policy.Policy.RuleState.POLICY_INACTIVE.getNumber()) {
-        output.writeEnum(2, policyRuleState_);
+      if (policyRuleState_ != policy.Policy.RuleState.POLICY_UNDEFINED.getNumber()) {
+        output.writeEnum(1, policyRuleState_);
       }
       unknownFields.writeTo(output);
     }
@@ -1101,13 +1056,9 @@ public final class Policy {
       if (size != -1) return size;
 
       size = 0;
-      if (policyRuleId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getPolicyRuleId());
-      }
-      if (policyRuleState_ != policy.Policy.RuleState.POLICY_INACTIVE.getNumber()) {
+      if (policyRuleState_ != policy.Policy.RuleState.POLICY_UNDEFINED.getNumber()) {
         size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(2, policyRuleState_);
+          .computeEnumSize(1, policyRuleState_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -1124,11 +1075,6 @@ public final class Policy {
       }
       policy.Policy.PolicyRuleState other = (policy.Policy.PolicyRuleState) obj;
 
-      if (hasPolicyRuleId() != other.hasPolicyRuleId()) return false;
-      if (hasPolicyRuleId()) {
-        if (!getPolicyRuleId()
-            .equals(other.getPolicyRuleId())) return false;
-      }
       if (policyRuleState_ != other.policyRuleState_) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -1141,10 +1087,6 @@ public final class Policy {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasPolicyRuleId()) {
-        hash = (37 * hash) + POLICYRULEID_FIELD_NUMBER;
-        hash = (53 * hash) + getPolicyRuleId().hashCode();
-      }
       hash = (37 * hash) + POLICYRULESTATE_FIELD_NUMBER;
       hash = (53 * hash) + policyRuleState_;
       hash = (29 * hash) + unknownFields.hashCode();
@@ -1280,12 +1222,6 @@ public final class Policy {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleId_ = null;
-        } else {
-          policyRuleId_ = null;
-          policyRuleIdBuilder_ = null;
-        }
         policyRuleState_ = 0;
 
         return this;
@@ -1314,11 +1250,6 @@ public final class Policy {
       @java.lang.Override
       public policy.Policy.PolicyRuleState buildPartial() {
         policy.Policy.PolicyRuleState result = new policy.Policy.PolicyRuleState(this);
-        if (policyRuleIdBuilder_ == null) {
-          result.policyRuleId_ = policyRuleId_;
-        } else {
-          result.policyRuleId_ = policyRuleIdBuilder_.build();
-        }
         result.policyRuleState_ = policyRuleState_;
         onBuilt();
         return result;
@@ -1368,9 +1299,6 @@ public final class Policy {
 
       public Builder mergeFrom(policy.Policy.PolicyRuleState other) {
         if (other == policy.Policy.PolicyRuleState.getDefaultInstance()) return this;
-        if (other.hasPolicyRuleId()) {
-          mergePolicyRuleId(other.getPolicyRuleId());
-        }
         if (other.policyRuleState_ != 0) {
           setPolicyRuleStateValue(other.getPolicyRuleStateValue());
         }
@@ -1403,146 +1331,27 @@ public final class Policy {
         return this;
       }
 
-      private context.ContextOuterClass.Uuid policyRuleId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> policyRuleIdBuilder_;
-      /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       * @return Whether the policyRuleId field is set.
-       */
-      public boolean hasPolicyRuleId() {
-        return policyRuleIdBuilder_ != null || policyRuleId_ != null;
-      }
+      private int policyRuleState_ = 0;
       /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       * @return The policyRuleId.
+       * <code>.policy.RuleState policyRuleState = 1;</code>
+       * @return The enum numeric value on the wire for policyRuleState.
        */
-      public context.ContextOuterClass.Uuid getPolicyRuleId() {
-        if (policyRuleIdBuilder_ == null) {
-          return policyRuleId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleId_;
-        } else {
-          return policyRuleIdBuilder_.getMessage();
-        }
+      @java.lang.Override public int getPolicyRuleStateValue() {
+        return policyRuleState_;
       }
       /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
+       * <code>.policy.RuleState policyRuleState = 1;</code>
+       * @param value The enum numeric value on the wire for policyRuleState to set.
+       * @return This builder for chaining.
        */
-      public Builder setPolicyRuleId(context.ContextOuterClass.Uuid value) {
-        if (policyRuleIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          policyRuleId_ = value;
-          onChanged();
-        } else {
-          policyRuleIdBuilder_.setMessage(value);
-        }
-
+      public Builder setPolicyRuleStateValue(int value) {
+        
+        policyRuleState_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       */
-      public Builder setPolicyRuleId(
-          context.ContextOuterClass.Uuid.Builder builderForValue) {
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleId_ = builderForValue.build();
-          onChanged();
-        } else {
-          policyRuleIdBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       */
-      public Builder mergePolicyRuleId(context.ContextOuterClass.Uuid value) {
-        if (policyRuleIdBuilder_ == null) {
-          if (policyRuleId_ != null) {
-            policyRuleId_ =
-              context.ContextOuterClass.Uuid.newBuilder(policyRuleId_).mergeFrom(value).buildPartial();
-          } else {
-            policyRuleId_ = value;
-          }
-          onChanged();
-        } else {
-          policyRuleIdBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       */
-      public Builder clearPolicyRuleId() {
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleId_ = null;
-          onChanged();
-        } else {
-          policyRuleId_ = null;
-          policyRuleIdBuilder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       */
-      public context.ContextOuterClass.Uuid.Builder getPolicyRuleIdBuilder() {
-        
-        onChanged();
-        return getPolicyRuleIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       */
-      public context.ContextOuterClass.UuidOrBuilder getPolicyRuleIdOrBuilder() {
-        if (policyRuleIdBuilder_ != null) {
-          return policyRuleIdBuilder_.getMessageOrBuilder();
-        } else {
-          return policyRuleId_ == null ?
-              context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleId_;
-        }
-      }
-      /**
-       * <code>.context.Uuid policyRuleId = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
-          getPolicyRuleIdFieldBuilder() {
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
-                  getPolicyRuleId(),
-                  getParentForChildren(),
-                  isClean());
-          policyRuleId_ = null;
-        }
-        return policyRuleIdBuilder_;
-      }
-
-      private int policyRuleState_ = 0;
-      /**
-       * <code>.policy.RuleState policyRuleState = 2;</code>
-       * @return The enum numeric value on the wire for policyRuleState.
-       */
-      @java.lang.Override public int getPolicyRuleStateValue() {
-        return policyRuleState_;
-      }
-      /**
-       * <code>.policy.RuleState policyRuleState = 2;</code>
-       * @param value The enum numeric value on the wire for policyRuleState to set.
-       * @return This builder for chaining.
-       */
-      public Builder setPolicyRuleStateValue(int value) {
-        
-        policyRuleState_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>.policy.RuleState policyRuleState = 2;</code>
+       * <code>.policy.RuleState policyRuleState = 1;</code>
        * @return The policyRuleState.
        */
       @java.lang.Override
@@ -1552,7 +1361,7 @@ public final class Policy {
         return result == null ? policy.Policy.RuleState.UNRECOGNIZED : result;
       }
       /**
-       * <code>.policy.RuleState policyRuleState = 2;</code>
+       * <code>.policy.RuleState policyRuleState = 1;</code>
        * @param value The policyRuleState to set.
        * @return This builder for chaining.
        */
@@ -1566,7 +1375,7 @@ public final class Policy {
         return this;
       }
       /**
-       * <code>.policy.RuleState policyRuleState = 2;</code>
+       * <code>.policy.RuleState policyRuleState = 1;</code>
        * @return This builder for chaining.
        */
       public Builder clearPolicyRuleState() {
@@ -1628,51 +1437,180 @@ public final class Policy {
 
   }
 
-  public interface PolicyRuleEventOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleEvent)
+  public interface PolicyRuleBasicOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleBasic)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
+     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     * @return Whether the policyRuleId field is set.
+     */
+    boolean hasPolicyRuleId();
+    /**
+     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     * @return The policyRuleId.
+     */
+    policy.Policy.PolicyRuleId getPolicyRuleId();
+    /**
+     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     */
+    policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder();
+
+    /**
+     * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+     * @return Whether the policyRuleState field is set.
+     */
+    boolean hasPolicyRuleState();
+    /**
+     * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+     * @return The policyRuleState.
+     */
+    policy.Policy.PolicyRuleState getPolicyRuleState();
+    /**
+     * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+     */
+    policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder();
+
+    /**
+     * <code>uint32 priority = 3;</code>
+     * @return The priority.
+     */
+    int getPriority();
+
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    java.util.List<policy.PolicyCondition.PolicyRuleCondition> 
+        getConditionListList();
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    policy.PolicyCondition.PolicyRuleCondition getConditionList(int index);
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    int getConditionListCount();
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    java.util.List<? extends policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
+        getConditionListOrBuilderList();
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    policy.PolicyCondition.PolicyRuleConditionOrBuilder getConditionListOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     * Evaluation operator to be used
+     * </pre>
+     *
+     * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+     * @return The enum numeric value on the wire for booleanOperator.
+     */
+    int getBooleanOperatorValue();
+    /**
+     * <pre>
+     * Evaluation operator to be used
+     * </pre>
+     *
+     * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+     * @return The booleanOperator.
+     */
+    policy.PolicyCondition.BooleanOperator getBooleanOperator();
+
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+     */
+    java.util.List<policy.PolicyAction.PolicyRuleAction> 
+        getActionListList();
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+     */
+    policy.PolicyAction.PolicyRuleAction getActionList(int index);
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
      */
-    boolean hasEvent();
+    int getActionListCount();
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
      */
-    context.ContextOuterClass.Event getEvent();
+    java.util.List<? extends policy.PolicyAction.PolicyRuleActionOrBuilder> 
+        getActionListOrBuilderList();
     /**
-     * <code>.context.Event event = 1;</code>
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
      */
-    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
+    policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(
+        int index);
   }
   /**
    * <pre>
-   * IETF draft: Framework for Use of ECA (Event Condition Action) in Network Self Management
-   *     Source: https://datatracker.ietf.org/doc/draft-bwd-netmod-eca-framework/
-   * Event
+   * Basic policy rule attributes
    * </pre>
    *
-   * Protobuf type {@code policy.PolicyRuleEvent}
+   * Protobuf type {@code policy.PolicyRuleBasic}
    */
-  public static final class PolicyRuleEvent extends
+  public static final class PolicyRuleBasic extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:policy.PolicyRuleEvent)
-      PolicyRuleEventOrBuilder {
+      // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
+      PolicyRuleBasicOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use PolicyRuleEvent.newBuilder() to construct.
-    private PolicyRuleEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use PolicyRuleBasic.newBuilder() to construct.
+    private PolicyRuleBasic(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private PolicyRuleEvent() {
+    private PolicyRuleBasic() {
+      conditionList_ = java.util.Collections.emptyList();
+      booleanOperator_ = 0;
+      actionList_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new PolicyRuleEvent();
+      return new PolicyRuleBasic();
     }
 
     @java.lang.Override
@@ -1680,7 +1618,7 @@ public final class Policy {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private PolicyRuleEvent(
+    private PolicyRuleBasic(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -1688,6 +1626,7 @@ public final class Policy {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -1699,16 +1638,58 @@ public final class Policy {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Event.Builder subBuilder = null;
-              if (event_ != null) {
-                subBuilder = event_.toBuilder();
+              policy.Policy.PolicyRuleId.Builder subBuilder = null;
+              if (policyRuleId_ != null) {
+                subBuilder = policyRuleId_.toBuilder();
+              }
+              policyRuleId_ = input.readMessage(policy.Policy.PolicyRuleId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(policyRuleId_);
+                policyRuleId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              policy.Policy.PolicyRuleState.Builder subBuilder = null;
+              if (((bitField0_ & 0x00000001) != 0)) {
+                subBuilder = policyRuleState_.toBuilder();
               }
-              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+              policyRuleState_ = input.readMessage(policy.Policy.PolicyRuleState.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(event_);
-                event_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(policyRuleState_);
+                policyRuleState_ = subBuilder.buildPartial();
+              }
+              bitField0_ |= 0x00000001;
+              break;
+            }
+            case 24: {
+
+              priority_ = input.readUInt32();
+              break;
+            }
+            case 34: {
+              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                conditionList_ = new java.util.ArrayList<policy.PolicyCondition.PolicyRuleCondition>();
+                mutable_bitField0_ |= 0x00000002;
               }
+              conditionList_.add(
+                  input.readMessage(policy.PolicyCondition.PolicyRuleCondition.parser(), extensionRegistry));
+              break;
+            }
+            case 40: {
+              int rawValue = input.readEnum();
 
+              booleanOperator_ = rawValue;
+              break;
+            }
+            case 50: {
+              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                actionList_ = new java.util.ArrayList<policy.PolicyAction.PolicyRuleAction>();
+                mutable_bitField0_ |= 0x00000004;
+              }
+              actionList_.add(
+                  input.readMessage(policy.PolicyAction.PolicyRuleAction.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -1726,47 +1707,238 @@ public final class Policy {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000002) != 0)) {
+          conditionList_ = java.util.Collections.unmodifiableList(conditionList_);
+        }
+        if (((mutable_bitField0_ & 0x00000004) != 0)) {
+          actionList_ = java.util.Collections.unmodifiableList(actionList_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return policy.Policy.internal_static_policy_PolicyRuleEvent_descriptor;
+      return policy.Policy.internal_static_policy_PolicyRuleBasic_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return policy.Policy.internal_static_policy_PolicyRuleEvent_fieldAccessorTable
+      return policy.Policy.internal_static_policy_PolicyRuleBasic_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              policy.Policy.PolicyRuleEvent.class, policy.Policy.PolicyRuleEvent.Builder.class);
+              policy.Policy.PolicyRuleBasic.class, policy.Policy.PolicyRuleBasic.Builder.class);
     }
 
-    public static final int EVENT_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Event event_;
+    private int bitField0_;
+    public static final int POLICYRULEID_FIELD_NUMBER = 1;
+    private policy.Policy.PolicyRuleId policyRuleId_;
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
+     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     * @return Whether the policyRuleId field is set.
      */
     @java.lang.Override
-    public boolean hasEvent() {
-      return event_ != null;
+    public boolean hasPolicyRuleId() {
+      return policyRuleId_ != null;
     }
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     * @return The policyRuleId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Event getEvent() {
-      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+    public policy.Policy.PolicyRuleId getPolicyRuleId() {
+      return policyRuleId_ == null ? policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
+    }
+    /**
+     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder() {
+      return getPolicyRuleId();
+    }
+
+    public static final int POLICYRULESTATE_FIELD_NUMBER = 2;
+    private policy.Policy.PolicyRuleState policyRuleState_;
+    /**
+     * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+     * @return Whether the policyRuleState field is set.
+     */
+    @java.lang.Override
+    public boolean hasPolicyRuleState() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+     * @return The policyRuleState.
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleState getPolicyRuleState() {
+      return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_;
+    }
+    /**
+     * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder() {
+      return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_;
+    }
+
+    public static final int PRIORITY_FIELD_NUMBER = 3;
+    private int priority_;
+    /**
+     * <code>uint32 priority = 3;</code>
+     * @return The priority.
+     */
+    @java.lang.Override
+    public int getPriority() {
+      return priority_;
+    }
+
+    public static final int CONDITIONLIST_FIELD_NUMBER = 4;
+    private java.util.List<policy.PolicyCondition.PolicyRuleCondition> conditionList_;
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<policy.PolicyCondition.PolicyRuleCondition> getConditionListList() {
+      return conditionList_;
+    }
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
+        getConditionListOrBuilderList() {
+      return conditionList_;
+    }
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    @java.lang.Override
+    public int getConditionListCount() {
+      return conditionList_.size();
+    }
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    @java.lang.Override
+    public policy.PolicyCondition.PolicyRuleCondition getConditionList(int index) {
+      return conditionList_.get(index);
+    }
+    /**
+     * <pre>
+     * Event-Condition-Action (ECA) model
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+     */
+    @java.lang.Override
+    public policy.PolicyCondition.PolicyRuleConditionOrBuilder getConditionListOrBuilder(
+        int index) {
+      return conditionList_.get(index);
+    }
+
+    public static final int BOOLEANOPERATOR_FIELD_NUMBER = 5;
+    private int booleanOperator_;
+    /**
+     * <pre>
+     * Evaluation operator to be used
+     * </pre>
+     *
+     * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+     * @return The enum numeric value on the wire for booleanOperator.
+     */
+    @java.lang.Override public int getBooleanOperatorValue() {
+      return booleanOperator_;
+    }
+    /**
+     * <pre>
+     * Evaluation operator to be used
+     * </pre>
+     *
+     * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+     * @return The booleanOperator.
+     */
+    @java.lang.Override public policy.PolicyCondition.BooleanOperator getBooleanOperator() {
+      @SuppressWarnings("deprecation")
+      policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.valueOf(booleanOperator_);
+      return result == null ? policy.PolicyCondition.BooleanOperator.UNRECOGNIZED : result;
+    }
+
+    public static final int ACTIONLIST_FIELD_NUMBER = 6;
+    private java.util.List<policy.PolicyAction.PolicyRuleAction> actionList_;
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+     */
+    @java.lang.Override
+    public java.util.List<policy.PolicyAction.PolicyRuleAction> getActionListList() {
+      return actionList_;
+    }
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends policy.PolicyAction.PolicyRuleActionOrBuilder> 
+        getActionListOrBuilderList() {
+      return actionList_;
+    }
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+     */
+    @java.lang.Override
+    public int getActionListCount() {
+      return actionList_.size();
+    }
+    /**
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+     */
+    @java.lang.Override
+    public policy.PolicyAction.PolicyRuleAction getActionList(int index) {
+      return actionList_.get(index);
     }
     /**
-     * <code>.context.Event event = 1;</code>
+     * <pre>
+     * One or more actions should be applied
+     * </pre>
+     *
+     * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-      return getEvent();
+    public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(
+        int index) {
+      return actionList_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -1783,8 +1955,23 @@ public final class Policy {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (event_ != null) {
-        output.writeMessage(1, getEvent());
+      if (policyRuleId_ != null) {
+        output.writeMessage(1, getPolicyRuleId());
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeMessage(2, getPolicyRuleState());
+      }
+      if (priority_ != 0) {
+        output.writeUInt32(3, priority_);
+      }
+      for (int i = 0; i < conditionList_.size(); i++) {
+        output.writeMessage(4, conditionList_.get(i));
+      }
+      if (booleanOperator_ != policy.PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED.getNumber()) {
+        output.writeEnum(5, booleanOperator_);
+      }
+      for (int i = 0; i < actionList_.size(); i++) {
+        output.writeMessage(6, actionList_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -1795,9 +1982,29 @@ public final class Policy {
       if (size != -1) return size;
 
       size = 0;
-      if (event_ != null) {
+      if (policyRuleId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getPolicyRuleId());
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getPolicyRuleState());
+      }
+      if (priority_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(3, priority_);
+      }
+      for (int i = 0; i < conditionList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, conditionList_.get(i));
+      }
+      if (booleanOperator_ != policy.PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED.getNumber()) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEvent());
+          .computeEnumSize(5, booleanOperator_);
+      }
+      for (int i = 0; i < actionList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, actionList_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -1809,16 +2016,28 @@ public final class Policy {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof policy.Policy.PolicyRuleEvent)) {
+      if (!(obj instanceof policy.Policy.PolicyRuleBasic)) {
         return super.equals(obj);
       }
-      policy.Policy.PolicyRuleEvent other = (policy.Policy.PolicyRuleEvent) obj;
+      policy.Policy.PolicyRuleBasic other = (policy.Policy.PolicyRuleBasic) obj;
 
-      if (hasEvent() != other.hasEvent()) return false;
-      if (hasEvent()) {
-        if (!getEvent()
-            .equals(other.getEvent())) return false;
+      if (hasPolicyRuleId() != other.hasPolicyRuleId()) return false;
+      if (hasPolicyRuleId()) {
+        if (!getPolicyRuleId()
+            .equals(other.getPolicyRuleId())) return false;
+      }
+      if (hasPolicyRuleState() != other.hasPolicyRuleState()) return false;
+      if (hasPolicyRuleState()) {
+        if (!getPolicyRuleState()
+            .equals(other.getPolicyRuleState())) return false;
       }
+      if (getPriority()
+          != other.getPriority()) return false;
+      if (!getConditionListList()
+          .equals(other.getConditionListList())) return false;
+      if (booleanOperator_ != other.booleanOperator_) return false;
+      if (!getActionListList()
+          .equals(other.getActionListList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -1830,78 +2049,94 @@ public final class Policy {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEvent()) {
-        hash = (37 * hash) + EVENT_FIELD_NUMBER;
-        hash = (53 * hash) + getEvent().hashCode();
+      if (hasPolicyRuleId()) {
+        hash = (37 * hash) + POLICYRULEID_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleId().hashCode();
+      }
+      if (hasPolicyRuleState()) {
+        hash = (37 * hash) + POLICYRULESTATE_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleState().hashCode();
+      }
+      hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
+      hash = (53 * hash) + getPriority();
+      if (getConditionListCount() > 0) {
+        hash = (37 * hash) + CONDITIONLIST_FIELD_NUMBER;
+        hash = (53 * hash) + getConditionListList().hashCode();
+      }
+      hash = (37 * hash) + BOOLEANOPERATOR_FIELD_NUMBER;
+      hash = (53 * hash) + booleanOperator_;
+      if (getActionListCount() > 0) {
+        hash = (37 * hash) + ACTIONLIST_FIELD_NUMBER;
+        hash = (53 * hash) + getActionListList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(byte[] data)
+    public static policy.Policy.PolicyRuleBasic parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(java.io.InputStream input)
+    public static policy.Policy.PolicyRuleBasic parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic 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 policy.Policy.PolicyRuleEvent parseDelimitedFrom(java.io.InputStream input)
+    public static policy.Policy.PolicyRuleBasic parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRuleEvent parseDelimitedFrom(
+    public static policy.Policy.PolicyRuleBasic 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 policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRuleEvent parseFrom(
+    public static policy.Policy.PolicyRuleBasic parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -1914,7 +2149,7 @@ public final class Policy {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(policy.Policy.PolicyRuleEvent prototype) {
+    public static Builder newBuilder(policy.Policy.PolicyRuleBasic prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -1931,31 +2166,29 @@ public final class Policy {
     }
     /**
      * <pre>
-     * IETF draft: Framework for Use of ECA (Event Condition Action) in Network Self Management
-     *     Source: https://datatracker.ietf.org/doc/draft-bwd-netmod-eca-framework/
-     * Event
+     * Basic policy rule attributes
      * </pre>
      *
-     * Protobuf type {@code policy.PolicyRuleEvent}
+     * Protobuf type {@code policy.PolicyRuleBasic}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleEvent)
-        policy.Policy.PolicyRuleEventOrBuilder {
+        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
+        policy.Policy.PolicyRuleBasicOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return policy.Policy.internal_static_policy_PolicyRuleEvent_descriptor;
+        return policy.Policy.internal_static_policy_PolicyRuleBasic_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return policy.Policy.internal_static_policy_PolicyRuleEvent_fieldAccessorTable
+        return policy.Policy.internal_static_policy_PolicyRuleBasic_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                policy.Policy.PolicyRuleEvent.class, policy.Policy.PolicyRuleEvent.Builder.class);
+                policy.Policy.PolicyRuleBasic.class, policy.Policy.PolicyRuleBasic.Builder.class);
       }
 
-      // Construct using policy.Policy.PolicyRuleEvent.newBuilder()
+      // Construct using policy.Policy.PolicyRuleBasic.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -1968,16 +2201,41 @@ public final class Policy {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getPolicyRuleStateFieldBuilder();
+          getConditionListFieldBuilder();
+          getActionListFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (eventBuilder_ == null) {
-          event_ = null;
+        if (policyRuleIdBuilder_ == null) {
+          policyRuleId_ = null;
+        } else {
+          policyRuleId_ = null;
+          policyRuleIdBuilder_ = null;
+        }
+        if (policyRuleStateBuilder_ == null) {
+          policyRuleState_ = null;
         } else {
-          event_ = null;
-          eventBuilder_ = null;
+          policyRuleStateBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        priority_ = 0;
+
+        if (conditionListBuilder_ == null) {
+          conditionList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          conditionListBuilder_.clear();
+        }
+        booleanOperator_ = 0;
+
+        if (actionListBuilder_ == null) {
+          actionList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          actionListBuilder_.clear();
         }
         return this;
       }
@@ -1985,17 +2243,17 @@ public final class Policy {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return policy.Policy.internal_static_policy_PolicyRuleEvent_descriptor;
+        return policy.Policy.internal_static_policy_PolicyRuleBasic_descriptor;
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRuleEvent getDefaultInstanceForType() {
-        return policy.Policy.PolicyRuleEvent.getDefaultInstance();
+      public policy.Policy.PolicyRuleBasic getDefaultInstanceForType() {
+        return policy.Policy.PolicyRuleBasic.getDefaultInstance();
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRuleEvent build() {
-        policy.Policy.PolicyRuleEvent result = buildPartial();
+      public policy.Policy.PolicyRuleBasic build() {
+        policy.Policy.PolicyRuleBasic result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -2003,25 +2261,56 @@ public final class Policy {
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRuleEvent buildPartial() {
-        policy.Policy.PolicyRuleEvent result = new policy.Policy.PolicyRuleEvent(this);
-        if (eventBuilder_ == null) {
-          result.event_ = event_;
+      public policy.Policy.PolicyRuleBasic buildPartial() {
+        policy.Policy.PolicyRuleBasic result = new policy.Policy.PolicyRuleBasic(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (policyRuleIdBuilder_ == null) {
+          result.policyRuleId_ = policyRuleId_;
         } else {
-          result.event_ = eventBuilder_.build();
+          result.policyRuleId_ = policyRuleIdBuilder_.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) {
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          if (policyRuleStateBuilder_ == null) {
+            result.policyRuleState_ = policyRuleState_;
+          } else {
+            result.policyRuleState_ = policyRuleStateBuilder_.build();
+          }
+          to_bitField0_ |= 0x00000001;
+        }
+        result.priority_ = priority_;
+        if (conditionListBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0)) {
+            conditionList_ = java.util.Collections.unmodifiableList(conditionList_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.conditionList_ = conditionList_;
+        } else {
+          result.conditionList_ = conditionListBuilder_.build();
+        }
+        result.booleanOperator_ = booleanOperator_;
+        if (actionListBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0)) {
+            actionList_ = java.util.Collections.unmodifiableList(actionList_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.actionList_ = actionList_;
+        } else {
+          result.actionList_ = actionListBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        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
@@ -2048,18 +2337,79 @@ public final class Policy {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof policy.Policy.PolicyRuleEvent) {
-          return mergeFrom((policy.Policy.PolicyRuleEvent)other);
+        if (other instanceof policy.Policy.PolicyRuleBasic) {
+          return mergeFrom((policy.Policy.PolicyRuleBasic)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(policy.Policy.PolicyRuleEvent other) {
-        if (other == policy.Policy.PolicyRuleEvent.getDefaultInstance()) return this;
-        if (other.hasEvent()) {
-          mergeEvent(other.getEvent());
+      public Builder mergeFrom(policy.Policy.PolicyRuleBasic other) {
+        if (other == policy.Policy.PolicyRuleBasic.getDefaultInstance()) return this;
+        if (other.hasPolicyRuleId()) {
+          mergePolicyRuleId(other.getPolicyRuleId());
+        }
+        if (other.hasPolicyRuleState()) {
+          mergePolicyRuleState(other.getPolicyRuleState());
+        }
+        if (other.getPriority() != 0) {
+          setPriority(other.getPriority());
+        }
+        if (conditionListBuilder_ == null) {
+          if (!other.conditionList_.isEmpty()) {
+            if (conditionList_.isEmpty()) {
+              conditionList_ = other.conditionList_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureConditionListIsMutable();
+              conditionList_.addAll(other.conditionList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.conditionList_.isEmpty()) {
+            if (conditionListBuilder_.isEmpty()) {
+              conditionListBuilder_.dispose();
+              conditionListBuilder_ = null;
+              conditionList_ = other.conditionList_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              conditionListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getConditionListFieldBuilder() : null;
+            } else {
+              conditionListBuilder_.addAllMessages(other.conditionList_);
+            }
+          }
+        }
+        if (other.booleanOperator_ != 0) {
+          setBooleanOperatorValue(other.getBooleanOperatorValue());
+        }
+        if (actionListBuilder_ == null) {
+          if (!other.actionList_.isEmpty()) {
+            if (actionList_.isEmpty()) {
+              actionList_ = other.actionList_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureActionListIsMutable();
+              actionList_.addAll(other.actionList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.actionList_.isEmpty()) {
+            if (actionListBuilder_.isEmpty()) {
+              actionListBuilder_.dispose();
+              actionListBuilder_ = null;
+              actionList_ = other.actionList_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              actionListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getActionListFieldBuilder() : null;
+            } else {
+              actionListBuilder_.addAllMessages(other.actionList_);
+            }
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -2076,11 +2426,11 @@ public final class Policy {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        policy.Policy.PolicyRuleEvent parsedMessage = null;
+        policy.Policy.PolicyRuleBasic parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (policy.Policy.PolicyRuleEvent) e.getUnfinishedMessage();
+          parsedMessage = (policy.Policy.PolicyRuleBasic) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -2089,895 +2439,2707 @@ public final class Policy {
         }
         return this;
       }
+      private int bitField0_;
 
-      private context.ContextOuterClass.Event event_;
+      private policy.Policy.PolicyRuleId policyRuleId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
+          policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder> policyRuleIdBuilder_;
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return Whether the event field is set.
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * @return Whether the policyRuleId field is set.
        */
-      public boolean hasEvent() {
-        return eventBuilder_ != null || event_ != null;
+      public boolean hasPolicyRuleId() {
+        return policyRuleIdBuilder_ != null || policyRuleId_ != null;
       }
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return The event.
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * @return The policyRuleId.
        */
-      public context.ContextOuterClass.Event getEvent() {
-        if (eventBuilder_ == null) {
-          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+      public policy.Policy.PolicyRuleId getPolicyRuleId() {
+        if (policyRuleIdBuilder_ == null) {
+          return policyRuleId_ == null ? policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
         } else {
-          return eventBuilder_.getMessage();
+          return policyRuleIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
-      public Builder setEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
+      public Builder setPolicyRuleId(policy.Policy.PolicyRuleId value) {
+        if (policyRuleIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          event_ = value;
+          policyRuleId_ = value;
           onChanged();
         } else {
-          eventBuilder_.setMessage(value);
+          policyRuleIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
-      public Builder setEvent(
-          context.ContextOuterClass.Event.Builder builderForValue) {
-        if (eventBuilder_ == null) {
-          event_ = builderForValue.build();
+      public Builder setPolicyRuleId(
+          policy.Policy.PolicyRuleId.Builder builderForValue) {
+        if (policyRuleIdBuilder_ == null) {
+          policyRuleId_ = builderForValue.build();
           onChanged();
         } else {
-          eventBuilder_.setMessage(builderForValue.build());
+          policyRuleIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
-      public Builder mergeEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
-          if (event_ != null) {
-            event_ =
-              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
+      public Builder mergePolicyRuleId(policy.Policy.PolicyRuleId value) {
+        if (policyRuleIdBuilder_ == null) {
+          if (policyRuleId_ != null) {
+            policyRuleId_ =
+              policy.Policy.PolicyRuleId.newBuilder(policyRuleId_).mergeFrom(value).buildPartial();
           } else {
-            event_ = value;
+            policyRuleId_ = value;
           }
           onChanged();
         } else {
-          eventBuilder_.mergeFrom(value);
+          policyRuleIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
-      public Builder clearEvent() {
-        if (eventBuilder_ == null) {
-          event_ = null;
+      public Builder clearPolicyRuleId() {
+        if (policyRuleIdBuilder_ == null) {
+          policyRuleId_ = null;
           onChanged();
         } else {
-          event_ = null;
-          eventBuilder_ = null;
+          policyRuleId_ = null;
+          policyRuleIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
-      public context.ContextOuterClass.Event.Builder getEventBuilder() {
+      public policy.Policy.PolicyRuleId.Builder getPolicyRuleIdBuilder() {
         
         onChanged();
-        return getEventFieldBuilder().getBuilder();
+        return getPolicyRuleIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
-      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-        if (eventBuilder_ != null) {
-          return eventBuilder_.getMessageOrBuilder();
+      public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder() {
+        if (policyRuleIdBuilder_ != null) {
+          return policyRuleIdBuilder_.getMessageOrBuilder();
         } else {
-          return event_ == null ?
-              context.ContextOuterClass.Event.getDefaultInstance() : event_;
+          return policyRuleId_ == null ?
+              policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
-          getEventFieldBuilder() {
-        if (eventBuilder_ == null) {
-          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
-                  getEvent(),
+          policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder> 
+          getPolicyRuleIdFieldBuilder() {
+        if (policyRuleIdBuilder_ == null) {
+          policyRuleIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder>(
+                  getPolicyRuleId(),
                   getParentForChildren(),
                   isClean());
-          event_ = null;
+          policyRuleId_ = null;
         }
-        return eventBuilder_;
+        return policyRuleIdBuilder_;
       }
-      @java.lang.Override
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
+
+      private policy.Policy.PolicyRuleState policyRuleState_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          policy.Policy.PolicyRuleState, policy.Policy.PolicyRuleState.Builder, policy.Policy.PolicyRuleStateOrBuilder> policyRuleStateBuilder_;
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       * @return Whether the policyRuleState field is set.
+       */
+      public boolean hasPolicyRuleState() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       * @return The policyRuleState.
+       */
+      public policy.Policy.PolicyRuleState getPolicyRuleState() {
+        if (policyRuleStateBuilder_ == null) {
+          return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_;
+        } else {
+          return policyRuleStateBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      public Builder setPolicyRuleState(policy.Policy.PolicyRuleState value) {
+        if (policyRuleStateBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          policyRuleState_ = value;
+          onChanged();
+        } else {
+          policyRuleStateBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000001;
+        return this;
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      public Builder setPolicyRuleState(
+          policy.Policy.PolicyRuleState.Builder builderForValue) {
+        if (policyRuleStateBuilder_ == null) {
+          policyRuleState_ = builderForValue.build();
+          onChanged();
+        } else {
+          policyRuleStateBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000001;
+        return this;
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      public Builder mergePolicyRuleState(policy.Policy.PolicyRuleState value) {
+        if (policyRuleStateBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0) &&
+              policyRuleState_ != null &&
+              policyRuleState_ != policy.Policy.PolicyRuleState.getDefaultInstance()) {
+            policyRuleState_ =
+              policy.Policy.PolicyRuleState.newBuilder(policyRuleState_).mergeFrom(value).buildPartial();
+          } else {
+            policyRuleState_ = value;
+          }
+          onChanged();
+        } else {
+          policyRuleStateBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000001;
+        return this;
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      public Builder clearPolicyRuleState() {
+        if (policyRuleStateBuilder_ == null) {
+          policyRuleState_ = null;
+          onChanged();
+        } else {
+          policyRuleStateBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      public policy.Policy.PolicyRuleState.Builder getPolicyRuleStateBuilder() {
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return getPolicyRuleStateFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      public policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder() {
+        if (policyRuleStateBuilder_ != null) {
+          return policyRuleStateBuilder_.getMessageOrBuilder();
+        } else {
+          return policyRuleState_ == null ?
+              policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_;
+        }
+      }
+      /**
+       * <code>optional .policy.PolicyRuleState policyRuleState = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          policy.Policy.PolicyRuleState, policy.Policy.PolicyRuleState.Builder, policy.Policy.PolicyRuleStateOrBuilder> 
+          getPolicyRuleStateFieldBuilder() {
+        if (policyRuleStateBuilder_ == null) {
+          policyRuleStateBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              policy.Policy.PolicyRuleState, policy.Policy.PolicyRuleState.Builder, policy.Policy.PolicyRuleStateOrBuilder>(
+                  getPolicyRuleState(),
+                  getParentForChildren(),
+                  isClean());
+          policyRuleState_ = null;
+        }
+        return policyRuleStateBuilder_;
       }
 
+      private int priority_ ;
+      /**
+       * <code>uint32 priority = 3;</code>
+       * @return The priority.
+       */
       @java.lang.Override
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
+      public int getPriority() {
+        return priority_;
+      }
+      /**
+       * <code>uint32 priority = 3;</code>
+       * @param value The priority to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPriority(int value) {
+        
+        priority_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 priority = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearPriority() {
+        
+        priority_ = 0;
+        onChanged();
+        return this;
       }
 
+      private java.util.List<policy.PolicyCondition.PolicyRuleCondition> conditionList_ =
+        java.util.Collections.emptyList();
+      private void ensureConditionListIsMutable() {
+        if (!((bitField0_ & 0x00000002) != 0)) {
+          conditionList_ = new java.util.ArrayList<policy.PolicyCondition.PolicyRuleCondition>(conditionList_);
+          bitField0_ |= 0x00000002;
+         }
+      }
 
-      // @@protoc_insertion_point(builder_scope:policy.PolicyRuleEvent)
-    }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          policy.PolicyCondition.PolicyRuleCondition, policy.PolicyCondition.PolicyRuleCondition.Builder, policy.PolicyCondition.PolicyRuleConditionOrBuilder> conditionListBuilder_;
+
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public java.util.List<policy.PolicyCondition.PolicyRuleCondition> getConditionListList() {
+        if (conditionListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(conditionList_);
+        } else {
+          return conditionListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public int getConditionListCount() {
+        if (conditionListBuilder_ == null) {
+          return conditionList_.size();
+        } else {
+          return conditionListBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public policy.PolicyCondition.PolicyRuleCondition getConditionList(int index) {
+        if (conditionListBuilder_ == null) {
+          return conditionList_.get(index);
+        } else {
+          return conditionListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder setConditionList(
+          int index, policy.PolicyCondition.PolicyRuleCondition value) {
+        if (conditionListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConditionListIsMutable();
+          conditionList_.set(index, value);
+          onChanged();
+        } else {
+          conditionListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder setConditionList(
+          int index, policy.PolicyCondition.PolicyRuleCondition.Builder builderForValue) {
+        if (conditionListBuilder_ == null) {
+          ensureConditionListIsMutable();
+          conditionList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          conditionListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder addConditionList(policy.PolicyCondition.PolicyRuleCondition value) {
+        if (conditionListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConditionListIsMutable();
+          conditionList_.add(value);
+          onChanged();
+        } else {
+          conditionListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder addConditionList(
+          int index, policy.PolicyCondition.PolicyRuleCondition value) {
+        if (conditionListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConditionListIsMutable();
+          conditionList_.add(index, value);
+          onChanged();
+        } else {
+          conditionListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder addConditionList(
+          policy.PolicyCondition.PolicyRuleCondition.Builder builderForValue) {
+        if (conditionListBuilder_ == null) {
+          ensureConditionListIsMutable();
+          conditionList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          conditionListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder addConditionList(
+          int index, policy.PolicyCondition.PolicyRuleCondition.Builder builderForValue) {
+        if (conditionListBuilder_ == null) {
+          ensureConditionListIsMutable();
+          conditionList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          conditionListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder addAllConditionList(
+          java.lang.Iterable<? extends policy.PolicyCondition.PolicyRuleCondition> values) {
+        if (conditionListBuilder_ == null) {
+          ensureConditionListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, conditionList_);
+          onChanged();
+        } else {
+          conditionListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder clearConditionList() {
+        if (conditionListBuilder_ == null) {
+          conditionList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          conditionListBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public Builder removeConditionList(int index) {
+        if (conditionListBuilder_ == null) {
+          ensureConditionListIsMutable();
+          conditionList_.remove(index);
+          onChanged();
+        } else {
+          conditionListBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public policy.PolicyCondition.PolicyRuleCondition.Builder getConditionListBuilder(
+          int index) {
+        return getConditionListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public policy.PolicyCondition.PolicyRuleConditionOrBuilder getConditionListOrBuilder(
+          int index) {
+        if (conditionListBuilder_ == null) {
+          return conditionList_.get(index);  } else {
+          return conditionListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public java.util.List<? extends policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
+           getConditionListOrBuilderList() {
+        if (conditionListBuilder_ != null) {
+          return conditionListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(conditionList_);
+        }
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public policy.PolicyCondition.PolicyRuleCondition.Builder addConditionListBuilder() {
+        return getConditionListFieldBuilder().addBuilder(
+            policy.PolicyCondition.PolicyRuleCondition.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public policy.PolicyCondition.PolicyRuleCondition.Builder addConditionListBuilder(
+          int index) {
+        return getConditionListFieldBuilder().addBuilder(
+            index, policy.PolicyCondition.PolicyRuleCondition.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Event-Condition-Action (ECA) model
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleCondition conditionList = 4;</code>
+       */
+      public java.util.List<policy.PolicyCondition.PolicyRuleCondition.Builder> 
+           getConditionListBuilderList() {
+        return getConditionListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          policy.PolicyCondition.PolicyRuleCondition, policy.PolicyCondition.PolicyRuleCondition.Builder, policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
+          getConditionListFieldBuilder() {
+        if (conditionListBuilder_ == null) {
+          conditionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              policy.PolicyCondition.PolicyRuleCondition, policy.PolicyCondition.PolicyRuleCondition.Builder, policy.PolicyCondition.PolicyRuleConditionOrBuilder>(
+                  conditionList_,
+                  ((bitField0_ & 0x00000002) != 0),
+                  getParentForChildren(),
+                  isClean());
+          conditionList_ = null;
+        }
+        return conditionListBuilder_;
+      }
+
+      private int booleanOperator_ = 0;
+      /**
+       * <pre>
+       * Evaluation operator to be used
+       * </pre>
+       *
+       * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+       * @return The enum numeric value on the wire for booleanOperator.
+       */
+      @java.lang.Override public int getBooleanOperatorValue() {
+        return booleanOperator_;
+      }
+      /**
+       * <pre>
+       * Evaluation operator to be used
+       * </pre>
+       *
+       * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+       * @param value The enum numeric value on the wire for booleanOperator to set.
+       * @return This builder for chaining.
+       */
+      public Builder setBooleanOperatorValue(int value) {
+        
+        booleanOperator_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Evaluation operator to be used
+       * </pre>
+       *
+       * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+       * @return The booleanOperator.
+       */
+      @java.lang.Override
+      public policy.PolicyCondition.BooleanOperator getBooleanOperator() {
+        @SuppressWarnings("deprecation")
+        policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.valueOf(booleanOperator_);
+        return result == null ? policy.PolicyCondition.BooleanOperator.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       * Evaluation operator to be used
+       * </pre>
+       *
+       * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+       * @param value The booleanOperator to set.
+       * @return This builder for chaining.
+       */
+      public Builder setBooleanOperator(policy.PolicyCondition.BooleanOperator value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        booleanOperator_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Evaluation operator to be used
+       * </pre>
+       *
+       * <code>.policy.BooleanOperator booleanOperator = 5;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearBooleanOperator() {
+        
+        booleanOperator_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<policy.PolicyAction.PolicyRuleAction> actionList_ =
+        java.util.Collections.emptyList();
+      private void ensureActionListIsMutable() {
+        if (!((bitField0_ & 0x00000004) != 0)) {
+          actionList_ = new java.util.ArrayList<policy.PolicyAction.PolicyRuleAction>(actionList_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          policy.PolicyAction.PolicyRuleAction, policy.PolicyAction.PolicyRuleAction.Builder, policy.PolicyAction.PolicyRuleActionOrBuilder> actionListBuilder_;
+
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public java.util.List<policy.PolicyAction.PolicyRuleAction> getActionListList() {
+        if (actionListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(actionList_);
+        } else {
+          return actionListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public int getActionListCount() {
+        if (actionListBuilder_ == null) {
+          return actionList_.size();
+        } else {
+          return actionListBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public policy.PolicyAction.PolicyRuleAction getActionList(int index) {
+        if (actionListBuilder_ == null) {
+          return actionList_.get(index);
+        } else {
+          return actionListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder setActionList(
+          int index, policy.PolicyAction.PolicyRuleAction value) {
+        if (actionListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureActionListIsMutable();
+          actionList_.set(index, value);
+          onChanged();
+        } else {
+          actionListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder setActionList(
+          int index, policy.PolicyAction.PolicyRuleAction.Builder builderForValue) {
+        if (actionListBuilder_ == null) {
+          ensureActionListIsMutable();
+          actionList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          actionListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder addActionList(policy.PolicyAction.PolicyRuleAction value) {
+        if (actionListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureActionListIsMutable();
+          actionList_.add(value);
+          onChanged();
+        } else {
+          actionListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder addActionList(
+          int index, policy.PolicyAction.PolicyRuleAction value) {
+        if (actionListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureActionListIsMutable();
+          actionList_.add(index, value);
+          onChanged();
+        } else {
+          actionListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder addActionList(
+          policy.PolicyAction.PolicyRuleAction.Builder builderForValue) {
+        if (actionListBuilder_ == null) {
+          ensureActionListIsMutable();
+          actionList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          actionListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder addActionList(
+          int index, policy.PolicyAction.PolicyRuleAction.Builder builderForValue) {
+        if (actionListBuilder_ == null) {
+          ensureActionListIsMutable();
+          actionList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          actionListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder addAllActionList(
+          java.lang.Iterable<? extends policy.PolicyAction.PolicyRuleAction> values) {
+        if (actionListBuilder_ == null) {
+          ensureActionListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, actionList_);
+          onChanged();
+        } else {
+          actionListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder clearActionList() {
+        if (actionListBuilder_ == null) {
+          actionList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          actionListBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public Builder removeActionList(int index) {
+        if (actionListBuilder_ == null) {
+          ensureActionListIsMutable();
+          actionList_.remove(index);
+          onChanged();
+        } else {
+          actionListBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public policy.PolicyAction.PolicyRuleAction.Builder getActionListBuilder(
+          int index) {
+        return getActionListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(
+          int index) {
+        if (actionListBuilder_ == null) {
+          return actionList_.get(index);  } else {
+          return actionListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public java.util.List<? extends policy.PolicyAction.PolicyRuleActionOrBuilder> 
+           getActionListOrBuilderList() {
+        if (actionListBuilder_ != null) {
+          return actionListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(actionList_);
+        }
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public policy.PolicyAction.PolicyRuleAction.Builder addActionListBuilder() {
+        return getActionListFieldBuilder().addBuilder(
+            policy.PolicyAction.PolicyRuleAction.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public policy.PolicyAction.PolicyRuleAction.Builder addActionListBuilder(
+          int index) {
+        return getActionListFieldBuilder().addBuilder(
+            index, policy.PolicyAction.PolicyRuleAction.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * One or more actions should be applied
+       * </pre>
+       *
+       * <code>repeated .policy.PolicyRuleAction actionList = 6;</code>
+       */
+      public java.util.List<policy.PolicyAction.PolicyRuleAction.Builder> 
+           getActionListBuilderList() {
+        return getActionListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          policy.PolicyAction.PolicyRuleAction, policy.PolicyAction.PolicyRuleAction.Builder, policy.PolicyAction.PolicyRuleActionOrBuilder> 
+          getActionListFieldBuilder() {
+        if (actionListBuilder_ == null) {
+          actionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              policy.PolicyAction.PolicyRuleAction, policy.PolicyAction.PolicyRuleAction.Builder, policy.PolicyAction.PolicyRuleActionOrBuilder>(
+                  actionList_,
+                  ((bitField0_ & 0x00000004) != 0),
+                  getParentForChildren(),
+                  isClean());
+          actionList_ = null;
+        }
+        return actionListBuilder_;
+      }
+      @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:policy.PolicyRuleBasic)
+    }
+
+    // @@protoc_insertion_point(class_scope:policy.PolicyRuleBasic)
+    private static final policy.Policy.PolicyRuleBasic DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleBasic();
+    }
+
+    public static policy.Policy.PolicyRuleBasic getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<PolicyRuleBasic>
+        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleBasic>() {
+      @java.lang.Override
+      public PolicyRuleBasic parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new PolicyRuleBasic(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<PolicyRuleBasic> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<PolicyRuleBasic> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public policy.Policy.PolicyRuleBasic getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface PolicyRuleServiceOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleService)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Basic policy rule attributes
+     * </pre>
+     *
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return Whether the policyRuleBasic field is set.
+     */
+    boolean hasPolicyRuleBasic();
+    /**
+     * <pre>
+     * Basic policy rule attributes
+     * </pre>
+     *
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return The policyRuleBasic.
+     */
+    policy.Policy.PolicyRuleBasic getPolicyRuleBasic();
+    /**
+     * <pre>
+     * Basic policy rule attributes
+     * </pre>
+     *
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     */
+    policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder();
+
+    /**
+     * <pre>
+     * Affected service and (some of) its device(s)
+     * </pre>
+     *
+     * <code>.context.ServiceId serviceId = 2;</code>
+     * @return Whether the serviceId field is set.
+     */
+    boolean hasServiceId();
+    /**
+     * <pre>
+     * Affected service and (some of) its device(s)
+     * </pre>
+     *
+     * <code>.context.ServiceId serviceId = 2;</code>
+     * @return The serviceId.
+     */
+    context.ContextOuterClass.ServiceId getServiceId();
+    /**
+     * <pre>
+     * Affected service and (some of) its device(s)
+     * </pre>
+     *
+     * <code>.context.ServiceId serviceId = 2;</code>
+     */
+    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
+
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    java.util.List<context.ContextOuterClass.DeviceId> 
+        getDeviceListList();
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    context.ContextOuterClass.DeviceId getDeviceList(int index);
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    int getDeviceListCount();
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+        getDeviceListOrBuilderList();
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * Service-oriented policy rule
+   * </pre>
+   *
+   * Protobuf type {@code policy.PolicyRuleService}
+   */
+  public static final class PolicyRuleService extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
+      PolicyRuleServiceOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use PolicyRuleService.newBuilder() to construct.
+    private PolicyRuleService(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private PolicyRuleService() {
+      deviceList_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new PolicyRuleService();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private PolicyRuleService(
+        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: {
+              policy.Policy.PolicyRuleBasic.Builder subBuilder = null;
+              if (policyRuleBasic_ != null) {
+                subBuilder = policyRuleBasic_.toBuilder();
+              }
+              policyRuleBasic_ = input.readMessage(policy.Policy.PolicyRuleBasic.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(policyRuleBasic_);
+                policyRuleBasic_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+              if (serviceId_ != null) {
+                subBuilder = serviceId_.toBuilder();
+              }
+              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(serviceId_);
+                serviceId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 26: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                deviceList_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              deviceList_.add(
+                  input.readMessage(context.ContextOuterClass.DeviceId.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)) {
+          deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return policy.Policy.internal_static_policy_PolicyRuleService_descriptor;
+    }
 
-    // @@protoc_insertion_point(class_scope:policy.PolicyRuleEvent)
-    private static final policy.Policy.PolicyRuleEvent DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleEvent();
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return policy.Policy.internal_static_policy_PolicyRuleService_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              policy.Policy.PolicyRuleService.class, policy.Policy.PolicyRuleService.Builder.class);
+    }
+
+    public static final int POLICYRULEBASIC_FIELD_NUMBER = 1;
+    private policy.Policy.PolicyRuleBasic policyRuleBasic_;
+    /**
+     * <pre>
+     * Basic policy rule attributes
+     * </pre>
+     *
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return Whether the policyRuleBasic field is set.
+     */
+    @java.lang.Override
+    public boolean hasPolicyRuleBasic() {
+      return policyRuleBasic_ != null;
+    }
+    /**
+     * <pre>
+     * Basic policy rule attributes
+     * </pre>
+     *
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return The policyRuleBasic.
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleBasic getPolicyRuleBasic() {
+      return policyRuleBasic_ == null ? policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
+    }
+    /**
+     * <pre>
+     * Basic policy rule attributes
+     * </pre>
+     *
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder() {
+      return getPolicyRuleBasic();
+    }
+
+    public static final int SERVICEID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.ServiceId serviceId_;
+    /**
+     * <pre>
+     * Affected service and (some of) its device(s)
+     * </pre>
+     *
+     * <code>.context.ServiceId serviceId = 2;</code>
+     * @return Whether the serviceId field is set.
+     */
+    @java.lang.Override
+    public boolean hasServiceId() {
+      return serviceId_ != null;
+    }
+    /**
+     * <pre>
+     * Affected service and (some of) its device(s)
+     * </pre>
+     *
+     * <code>.context.ServiceId serviceId = 2;</code>
+     * @return The serviceId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceId getServiceId() {
+      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+    }
+    /**
+     * <pre>
+     * Affected service and (some of) its device(s)
+     * </pre>
+     *
+     * <code>.context.ServiceId serviceId = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+      return getServiceId();
+    }
+
+    public static final int DEVICELIST_FIELD_NUMBER = 3;
+    private java.util.List<context.ContextOuterClass.DeviceId> deviceList_;
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.DeviceId> getDeviceListList() {
+      return deviceList_;
+    }
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+        getDeviceListOrBuilderList() {
+      return deviceList_;
+    }
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    @java.lang.Override
+    public int getDeviceListCount() {
+      return deviceList_.size();
+    }
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceId getDeviceList(int index) {
+      return deviceList_.get(index);
+    }
+    /**
+     * <pre>
+     * List of devices this service is traversing (not exhaustive)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
+        int index) {
+      return deviceList_.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 (policyRuleBasic_ != null) {
+        output.writeMessage(1, getPolicyRuleBasic());
+      }
+      if (serviceId_ != null) {
+        output.writeMessage(2, getServiceId());
+      }
+      for (int i = 0; i < deviceList_.size(); i++) {
+        output.writeMessage(3, deviceList_.get(i));
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (policyRuleBasic_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getPolicyRuleBasic());
+      }
+      if (serviceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getServiceId());
+      }
+      for (int i = 0; i < deviceList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, deviceList_.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 policy.Policy.PolicyRuleService)) {
+        return super.equals(obj);
+      }
+      policy.Policy.PolicyRuleService other = (policy.Policy.PolicyRuleService) obj;
+
+      if (hasPolicyRuleBasic() != other.hasPolicyRuleBasic()) return false;
+      if (hasPolicyRuleBasic()) {
+        if (!getPolicyRuleBasic()
+            .equals(other.getPolicyRuleBasic())) return false;
+      }
+      if (hasServiceId() != other.hasServiceId()) return false;
+      if (hasServiceId()) {
+        if (!getServiceId()
+            .equals(other.getServiceId())) return false;
+      }
+      if (!getDeviceListList()
+          .equals(other.getDeviceListList())) 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 (hasPolicyRuleBasic()) {
+        hash = (37 * hash) + POLICYRULEBASIC_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleBasic().hashCode();
+      }
+      if (hasServiceId()) {
+        hash = (37 * hash) + SERVICEID_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceId().hashCode();
+      }
+      if (getDeviceListCount() > 0) {
+        hash = (37 * hash) + DEVICELIST_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceListList().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static policy.Policy.PolicyRuleService parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleService parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleService parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleService parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleService parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleService parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleService parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleService 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 policy.Policy.PolicyRuleEvent getDefaultInstance() {
-      return DEFAULT_INSTANCE;
+    public static policy.Policy.PolicyRuleService parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
     }
-
-    private static final com.google.protobuf.Parser<PolicyRuleEvent>
-        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleEvent>() {
-      @java.lang.Override
-      public PolicyRuleEvent parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new PolicyRuleEvent(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<PolicyRuleEvent> parser() {
-      return PARSER;
+    public static policy.Policy.PolicyRuleService 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 policy.Policy.PolicyRuleService parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleService 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 com.google.protobuf.Parser<PolicyRuleEvent> getParserForType() {
-      return PARSER;
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(policy.Policy.PolicyRuleService prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
-
     @java.lang.Override
-    public policy.Policy.PolicyRuleEvent getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
 
-  }
-
-  public interface PolicyRuleOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:policy.PolicyRule)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * Basic policy rule attributes
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-     * @return Whether the policyRuleId field is set.
-     */
-    boolean hasPolicyRuleId();
-    /**
-     * <pre>
-     * Basic policy rule attributes
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-     * @return The policyRuleId.
-     */
-    policy.Policy.PolicyRuleId getPolicyRuleId();
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
     /**
      * <pre>
-     * Basic policy rule attributes
+     * Service-oriented policy rule
      * </pre>
      *
-     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+     * Protobuf type {@code policy.PolicyRuleService}
      */
-    policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder();
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
+        policy.Policy.PolicyRuleServiceOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return policy.Policy.internal_static_policy_PolicyRuleService_descriptor;
+      }
 
-    /**
-     * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-     * @return The enum numeric value on the wire for policyRuleType.
-     */
-    int getPolicyRuleTypeValue();
-    /**
-     * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-     * @return The policyRuleType.
-     */
-    policy.Policy.PolicyRuleType getPolicyRuleType();
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return policy.Policy.internal_static_policy_PolicyRuleService_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                policy.Policy.PolicyRuleService.class, policy.Policy.PolicyRuleService.Builder.class);
+      }
 
-    /**
-     * <code>uint32 priority = 3;</code>
-     * @return The priority.
-     */
-    int getPriority();
+      // Construct using policy.Policy.PolicyRuleService.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
 
-    /**
-     * <pre>
-     * Event-Condition-Action model
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleEvent event = 4;</code>
-     * @return Whether the event field is set.
-     */
-    boolean hasEvent();
-    /**
-     * <pre>
-     * Event-Condition-Action model
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleEvent event = 4;</code>
-     * @return The event.
-     */
-    policy.Policy.PolicyRuleEvent getEvent();
-    /**
-     * <pre>
-     * Event-Condition-Action model
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleEvent event = 4;</code>
-     */
-    policy.Policy.PolicyRuleEventOrBuilder getEventOrBuilder();
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getDeviceListFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasic_ = null;
+        } else {
+          policyRuleBasic_ = null;
+          policyRuleBasicBuilder_ = null;
+        }
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
+        if (deviceListBuilder_ == null) {
+          deviceList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          deviceListBuilder_.clear();
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return policy.Policy.internal_static_policy_PolicyRuleService_descriptor;
+      }
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleService getDefaultInstanceForType() {
+        return policy.Policy.PolicyRuleService.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleService build() {
+        policy.Policy.PolicyRuleService result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleService buildPartial() {
+        policy.Policy.PolicyRuleService result = new policy.Policy.PolicyRuleService(this);
+        int from_bitField0_ = bitField0_;
+        if (policyRuleBasicBuilder_ == null) {
+          result.policyRuleBasic_ = policyRuleBasic_;
+        } else {
+          result.policyRuleBasic_ = policyRuleBasicBuilder_.build();
+        }
+        if (serviceIdBuilder_ == null) {
+          result.serviceId_ = serviceId_;
+        } else {
+          result.serviceId_ = serviceIdBuilder_.build();
+        }
+        if (deviceListBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.deviceList_ = deviceList_;
+        } else {
+          result.deviceList_ = deviceListBuilder_.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 policy.Policy.PolicyRuleService) {
+          return mergeFrom((policy.Policy.PolicyRuleService)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(policy.Policy.PolicyRuleService other) {
+        if (other == policy.Policy.PolicyRuleService.getDefaultInstance()) return this;
+        if (other.hasPolicyRuleBasic()) {
+          mergePolicyRuleBasic(other.getPolicyRuleBasic());
+        }
+        if (other.hasServiceId()) {
+          mergeServiceId(other.getServiceId());
+        }
+        if (deviceListBuilder_ == null) {
+          if (!other.deviceList_.isEmpty()) {
+            if (deviceList_.isEmpty()) {
+              deviceList_ = other.deviceList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureDeviceListIsMutable();
+              deviceList_.addAll(other.deviceList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.deviceList_.isEmpty()) {
+            if (deviceListBuilder_.isEmpty()) {
+              deviceListBuilder_.dispose();
+              deviceListBuilder_ = null;
+              deviceList_ = other.deviceList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              deviceListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getDeviceListFieldBuilder() : null;
+            } else {
+              deviceListBuilder_.addAllMessages(other.deviceList_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
 
-    /**
-     * <pre>
-     * One or more conditions must be met
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-     */
-    java.util.List<policy.PolicyCondition.PolicyRuleCondition> 
-        getConditionListList();
-    /**
-     * <pre>
-     * One or more conditions must be met
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-     */
-    policy.PolicyCondition.PolicyRuleCondition getConditionList(int index);
-    /**
-     * <pre>
-     * One or more conditions must be met
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-     */
-    int getConditionListCount();
-    /**
-     * <pre>
-     * One or more conditions must be met
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-     */
-    java.util.List<? extends policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
-        getConditionListOrBuilderList();
-    /**
-     * <pre>
-     * One or more conditions must be met
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-     */
-    policy.PolicyCondition.PolicyRuleConditionOrBuilder getConditionListOrBuilder(
-        int index);
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        policy.Policy.PolicyRuleService parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (policy.Policy.PolicyRuleService) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
 
-    /**
-     * <pre>
-     * Evaluation operator to be used
-     * </pre>
-     *
-     * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-     * @return The enum numeric value on the wire for booleanOperator.
-     */
-    int getBooleanOperatorValue();
-    /**
-     * <pre>
-     * Evaluation operator to be used
-     * </pre>
-     *
-     * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-     * @return The booleanOperator.
-     */
-    policy.PolicyCondition.BooleanOperator getBooleanOperator();
+      private policy.Policy.PolicyRuleBasic policyRuleBasic_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          policy.Policy.PolicyRuleBasic, policy.Policy.PolicyRuleBasic.Builder, policy.Policy.PolicyRuleBasicOrBuilder> policyRuleBasicBuilder_;
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       * @return Whether the policyRuleBasic field is set.
+       */
+      public boolean hasPolicyRuleBasic() {
+        return policyRuleBasicBuilder_ != null || policyRuleBasic_ != null;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       * @return The policyRuleBasic.
+       */
+      public policy.Policy.PolicyRuleBasic getPolicyRuleBasic() {
+        if (policyRuleBasicBuilder_ == null) {
+          return policyRuleBasic_ == null ? policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
+        } else {
+          return policyRuleBasicBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder setPolicyRuleBasic(policy.Policy.PolicyRuleBasic value) {
+        if (policyRuleBasicBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          policyRuleBasic_ = value;
+          onChanged();
+        } else {
+          policyRuleBasicBuilder_.setMessage(value);
+        }
 
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    java.util.List<policy.PolicyAction.PolicyRuleAction> 
-        getActionListList();
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    policy.PolicyAction.PolicyRuleAction getActionList(int index);
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    int getActionListCount();
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    java.util.List<? extends policy.PolicyAction.PolicyRuleActionOrBuilder> 
-        getActionListOrBuilderList();
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(
-        int index);
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder setPolicyRuleBasic(
+          policy.Policy.PolicyRuleBasic.Builder builderForValue) {
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasic_ = builderForValue.build();
+          onChanged();
+        } else {
+          policyRuleBasicBuilder_.setMessage(builderForValue.build());
+        }
 
-    /**
-     * <pre>
-     * Affected service and devices
-     * </pre>
-     *
-     * <code>.context.ServiceId serviceId = 8;</code>
-     * @return Whether the serviceId field is set.
-     */
-    boolean hasServiceId();
-    /**
-     * <pre>
-     * Affected service and devices
-     * </pre>
-     *
-     * <code>.context.ServiceId serviceId = 8;</code>
-     * @return The serviceId.
-     */
-    context.ContextOuterClass.ServiceId getServiceId();
-    /**
-     * <pre>
-     * Affected service and devices
-     * </pre>
-     *
-     * <code>.context.ServiceId serviceId = 8;</code>
-     */
-    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder mergePolicyRuleBasic(policy.Policy.PolicyRuleBasic value) {
+        if (policyRuleBasicBuilder_ == null) {
+          if (policyRuleBasic_ != null) {
+            policyRuleBasic_ =
+              policy.Policy.PolicyRuleBasic.newBuilder(policyRuleBasic_).mergeFrom(value).buildPartial();
+          } else {
+            policyRuleBasic_ = value;
+          }
+          onChanged();
+        } else {
+          policyRuleBasicBuilder_.mergeFrom(value);
+        }
 
-    /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
-     */
-    java.util.List<context.ContextOuterClass.DeviceId> 
-        getDeviceListList();
-    /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
-     */
-    context.ContextOuterClass.DeviceId getDeviceList(int index);
-    /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
-     */
-    int getDeviceListCount();
-    /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
-     */
-    java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
-        getDeviceListOrBuilderList();
-    /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
-     */
-    context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
-        int index);
-  }
-  /**
-   * <pre>
-   * Policy rule partially complies with IETF’s:
-   *     RFC 3060: https://datatracker.ietf.org/doc/html/rfc3060
-   *     RFC 3460: https://datatracker.ietf.org/doc/html/rfc3460
-   * Enhanced with a policy rule event according to the ECA model
-   * </pre>
-   *
-   * Protobuf type {@code policy.PolicyRule}
-   */
-  public static final class PolicyRule extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:policy.PolicyRule)
-      PolicyRuleOrBuilder {
-  private static final long serialVersionUID = 0L;
-    // Use PolicyRule.newBuilder() to construct.
-    private PolicyRule(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private PolicyRule() {
-      policyRuleType_ = 0;
-      conditionList_ = java.util.Collections.emptyList();
-      booleanOperator_ = 0;
-      actionList_ = java.util.Collections.emptyList();
-      deviceList_ = java.util.Collections.emptyList();
-    }
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder clearPolicyRuleBasic() {
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasic_ = null;
+          onChanged();
+        } else {
+          policyRuleBasic_ = null;
+          policyRuleBasicBuilder_ = null;
+        }
 
-    @java.lang.Override
-    @SuppressWarnings({"unused"})
-    protected java.lang.Object newInstance(
-        UnusedPrivateParameter unused) {
-      return new PolicyRule();
-    }
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public policy.Policy.PolicyRuleBasic.Builder getPolicyRuleBasicBuilder() {
+        
+        onChanged();
+        return getPolicyRuleBasicFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder() {
+        if (policyRuleBasicBuilder_ != null) {
+          return policyRuleBasicBuilder_.getMessageOrBuilder();
+        } else {
+          return policyRuleBasic_ == null ?
+              policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
+        }
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          policy.Policy.PolicyRuleBasic, policy.Policy.PolicyRuleBasic.Builder, policy.Policy.PolicyRuleBasicOrBuilder> 
+          getPolicyRuleBasicFieldBuilder() {
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasicBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              policy.Policy.PolicyRuleBasic, policy.Policy.PolicyRuleBasic.Builder, policy.Policy.PolicyRuleBasicOrBuilder>(
+                  getPolicyRuleBasic(),
+                  getParentForChildren(),
+                  isClean());
+          policyRuleBasic_ = null;
+        }
+        return policyRuleBasicBuilder_;
+      }
 
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private PolicyRule(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      if (extensionRegistry == null) {
-        throw new java.lang.NullPointerException();
+      private context.ContextOuterClass.ServiceId serviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       * @return Whether the serviceId field is set.
+       */
+      public boolean hasServiceId() {
+        return serviceIdBuilder_ != null || serviceId_ != null;
       }
-      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: {
-              policy.Policy.PolicyRuleId.Builder subBuilder = null;
-              if (policyRuleId_ != null) {
-                subBuilder = policyRuleId_.toBuilder();
-              }
-              policyRuleId_ = input.readMessage(policy.Policy.PolicyRuleId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(policyRuleId_);
-                policyRuleId_ = subBuilder.buildPartial();
-              }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       * @return The serviceId.
+       */
+      public context.ContextOuterClass.ServiceId getServiceId() {
+        if (serviceIdBuilder_ == null) {
+          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        } else {
+          return serviceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          serviceId_ = value;
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(value);
+        }
 
-              break;
-            }
-            case 16: {
-              int rawValue = input.readEnum();
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      public Builder setServiceId(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(builderForValue.build());
+        }
 
-              policyRuleType_ = rawValue;
-              break;
-            }
-            case 24: {
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (serviceId_ != null) {
+            serviceId_ =
+              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
+          } else {
+            serviceId_ = value;
+          }
+          onChanged();
+        } else {
+          serviceIdBuilder_.mergeFrom(value);
+        }
 
-              priority_ = input.readUInt32();
-              break;
-            }
-            case 34: {
-              policy.Policy.PolicyRuleEvent.Builder subBuilder = null;
-              if (event_ != null) {
-                subBuilder = event_.toBuilder();
-              }
-              event_ = input.readMessage(policy.Policy.PolicyRuleEvent.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(event_);
-                event_ = subBuilder.buildPartial();
-              }
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      public Builder clearServiceId() {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+          onChanged();
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
 
-              break;
-            }
-            case 42: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                conditionList_ = new java.util.ArrayList<policy.PolicyCondition.PolicyRuleCondition>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              conditionList_.add(
-                  input.readMessage(policy.PolicyCondition.PolicyRuleCondition.parser(), extensionRegistry));
-              break;
-            }
-            case 48: {
-              int rawValue = input.readEnum();
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
+        
+        onChanged();
+        return getServiceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+        if (serviceIdBuilder_ != null) {
+          return serviceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return serviceId_ == null ?
+              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        }
+      }
+      /**
+       * <pre>
+       * Affected service and (some of) its device(s)
+       * </pre>
+       *
+       * <code>.context.ServiceId serviceId = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getServiceIdFieldBuilder() {
+        if (serviceIdBuilder_ == null) {
+          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  getServiceId(),
+                  getParentForChildren(),
+                  isClean());
+          serviceId_ = null;
+        }
+        return serviceIdBuilder_;
+      }
 
-              booleanOperator_ = rawValue;
-              break;
-            }
-            case 58: {
-              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-                actionList_ = new java.util.ArrayList<policy.PolicyAction.PolicyRuleAction>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              actionList_.add(
-                  input.readMessage(policy.PolicyAction.PolicyRuleAction.parser(), extensionRegistry));
-              break;
-            }
-            case 66: {
-              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
-              if (serviceId_ != null) {
-                subBuilder = serviceId_.toBuilder();
-              }
-              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(serviceId_);
-                serviceId_ = subBuilder.buildPartial();
-              }
+      private java.util.List<context.ContextOuterClass.DeviceId> deviceList_ =
+        java.util.Collections.emptyList();
+      private void ensureDeviceListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          deviceList_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>(deviceList_);
+          bitField0_ |= 0x00000001;
+         }
+      }
 
-              break;
-            }
-            case 74: {
-              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
-                deviceList_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>();
-                mutable_bitField0_ |= 0x00000004;
-              }
-              deviceList_.add(
-                  input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
-              break;
-            }
-            default: {
-              if (!parseUnknownField(
-                  input, unknownFields, extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceListBuilder_;
+
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.DeviceId> getDeviceListList() {
+        if (deviceListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(deviceList_);
+        } else {
+          return deviceListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public int getDeviceListCount() {
+        if (deviceListBuilder_ == null) {
+          return deviceList_.size();
+        } else {
+          return deviceListBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceId getDeviceList(int index) {
+        if (deviceListBuilder_ == null) {
+          return deviceList_.get(index);
+        } else {
+          return deviceListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder setDeviceList(
+          int index, context.ContextOuterClass.DeviceId value) {
+        if (deviceListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureDeviceListIsMutable();
+          deviceList_.set(index, value);
+          onChanged();
+        } else {
+          deviceListBuilder_.setMessage(index, value);
         }
-      } 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)) {
-          conditionList_ = java.util.Collections.unmodifiableList(conditionList_);
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder setDeviceList(
+          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          deviceListBuilder_.setMessage(index, builderForValue.build());
         }
-        if (((mutable_bitField0_ & 0x00000002) != 0)) {
-          actionList_ = java.util.Collections.unmodifiableList(actionList_);
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder addDeviceList(context.ContextOuterClass.DeviceId value) {
+        if (deviceListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceListIsMutable();
+          deviceList_.add(value);
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(value);
         }
-        if (((mutable_bitField0_ & 0x00000004) != 0)) {
-          deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder addDeviceList(
+          int index, context.ContextOuterClass.DeviceId value) {
+        if (deviceListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceListIsMutable();
+          deviceList_.add(index, value);
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(index, value);
         }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder addDeviceList(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder addDeviceList(
+          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder addAllDeviceList(
+          java.lang.Iterable<? extends context.ContextOuterClass.DeviceId> values) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, deviceList_);
+          onChanged();
+        } else {
+          deviceListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder clearDeviceList() {
+        if (deviceListBuilder_ == null) {
+          deviceList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          deviceListBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public Builder removeDeviceList(int index) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.remove(index);
+          onChanged();
+        } else {
+          deviceListBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder getDeviceListBuilder(
+          int index) {
+        return getDeviceListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
+          int index) {
+        if (deviceListBuilder_ == null) {
+          return deviceList_.get(index);  } else {
+          return deviceListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+           getDeviceListOrBuilderList() {
+        if (deviceListBuilder_ != null) {
+          return deviceListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(deviceList_);
+        }
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder addDeviceListBuilder() {
+        return getDeviceListFieldBuilder().addBuilder(
+            context.ContextOuterClass.DeviceId.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder addDeviceListBuilder(
+          int index) {
+        return getDeviceListFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.DeviceId.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * List of devices this service is traversing (not exhaustive)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.DeviceId.Builder> 
+           getDeviceListBuilderList() {
+        return getDeviceListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getDeviceListFieldBuilder() {
+        if (deviceListBuilder_ == null) {
+          deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  deviceList_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          deviceList_ = null;
+        }
+        return deviceListBuilder_;
+      }
+      @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:policy.PolicyRuleService)
     }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return policy.Policy.internal_static_policy_PolicyRule_descriptor;
+
+    // @@protoc_insertion_point(class_scope:policy.PolicyRuleService)
+    private static final policy.Policy.PolicyRuleService DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleService();
     }
 
-    @java.lang.Override
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return policy.Policy.internal_static_policy_PolicyRule_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              policy.Policy.PolicyRule.class, policy.Policy.PolicyRule.Builder.class);
+    public static policy.Policy.PolicyRuleService getDefaultInstance() {
+      return DEFAULT_INSTANCE;
     }
 
-    public static final int POLICYRULEID_FIELD_NUMBER = 1;
-    private policy.Policy.PolicyRuleId policyRuleId_;
-    /**
-     * <pre>
-     * Basic policy rule attributes
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-     * @return Whether the policyRuleId field is set.
-     */
-    @java.lang.Override
-    public boolean hasPolicyRuleId() {
-      return policyRuleId_ != null;
+    private static final com.google.protobuf.Parser<PolicyRuleService>
+        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleService>() {
+      @java.lang.Override
+      public PolicyRuleService parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new PolicyRuleService(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<PolicyRuleService> parser() {
+      return PARSER;
     }
-    /**
-     * <pre>
-     * Basic policy rule attributes
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-     * @return The policyRuleId.
-     */
+
     @java.lang.Override
-    public policy.Policy.PolicyRuleId getPolicyRuleId() {
-      return policyRuleId_ == null ? policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
+    public com.google.protobuf.Parser<PolicyRuleService> getParserForType() {
+      return PARSER;
     }
-    /**
-     * <pre>
-     * Basic policy rule attributes
-     * </pre>
-     *
-     * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-     */
+
     @java.lang.Override
-    public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder() {
-      return getPolicyRuleId();
+    public policy.Policy.PolicyRuleService getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
     }
 
-    public static final int POLICYRULETYPE_FIELD_NUMBER = 2;
-    private int policyRuleType_;
-    /**
-     * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-     * @return The enum numeric value on the wire for policyRuleType.
-     */
-    @java.lang.Override public int getPolicyRuleTypeValue() {
-      return policyRuleType_;
-    }
-    /**
-     * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-     * @return The policyRuleType.
-     */
-    @java.lang.Override public policy.Policy.PolicyRuleType getPolicyRuleType() {
-      @SuppressWarnings("deprecation")
-      policy.Policy.PolicyRuleType result = policy.Policy.PolicyRuleType.valueOf(policyRuleType_);
-      return result == null ? policy.Policy.PolicyRuleType.UNRECOGNIZED : result;
-    }
+  }
 
-    public static final int PRIORITY_FIELD_NUMBER = 3;
-    private int priority_;
-    /**
-     * <code>uint32 priority = 3;</code>
-     * @return The priority.
-     */
-    @java.lang.Override
-    public int getPriority() {
-      return priority_;
-    }
+  public interface PolicyRuleDeviceOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDevice)
+      com.google.protobuf.MessageOrBuilder {
 
-    public static final int EVENT_FIELD_NUMBER = 4;
-    private policy.Policy.PolicyRuleEvent event_;
     /**
      * <pre>
-     * Event-Condition-Action model
+     * Basic policy rule attributes
      * </pre>
      *
-     * <code>.policy.PolicyRuleEvent event = 4;</code>
-     * @return Whether the event field is set.
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return Whether the policyRuleBasic field is set.
      */
-    @java.lang.Override
-    public boolean hasEvent() {
-      return event_ != null;
-    }
+    boolean hasPolicyRuleBasic();
     /**
      * <pre>
-     * Event-Condition-Action model
+     * Basic policy rule attributes
      * </pre>
      *
-     * <code>.policy.PolicyRuleEvent event = 4;</code>
-     * @return The event.
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return The policyRuleBasic.
      */
-    @java.lang.Override
-    public policy.Policy.PolicyRuleEvent getEvent() {
-      return event_ == null ? policy.Policy.PolicyRuleEvent.getDefaultInstance() : event_;
-    }
+    policy.Policy.PolicyRuleBasic getPolicyRuleBasic();
     /**
      * <pre>
-     * Event-Condition-Action model
+     * Basic policy rule attributes
      * </pre>
      *
-     * <code>.policy.PolicyRuleEvent event = 4;</code>
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
      */
-    @java.lang.Override
-    public policy.Policy.PolicyRuleEventOrBuilder getEventOrBuilder() {
-      return getEvent();
-    }
+    policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder();
 
-    public static final int CONDITIONLIST_FIELD_NUMBER = 5;
-    private java.util.List<policy.PolicyCondition.PolicyRuleCondition> conditionList_;
-    /**
-     * <pre>
-     * One or more conditions must be met
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-     */
-    @java.lang.Override
-    public java.util.List<policy.PolicyCondition.PolicyRuleCondition> getConditionListList() {
-      return conditionList_;
-    }
     /**
      * <pre>
-     * One or more conditions must be met
+     * Affected device(s)
      * </pre>
      *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
-    @java.lang.Override
-    public java.util.List<? extends policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
-        getConditionListOrBuilderList() {
-      return conditionList_;
-    }
+    java.util.List<context.ContextOuterClass.DeviceId> 
+        getDeviceListList();
     /**
      * <pre>
-     * One or more conditions must be met
+     * Affected device(s)
      * </pre>
      *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
-    @java.lang.Override
-    public int getConditionListCount() {
-      return conditionList_.size();
-    }
+    context.ContextOuterClass.DeviceId getDeviceList(int index);
     /**
      * <pre>
-     * One or more conditions must be met
+     * Affected device(s)
      * </pre>
      *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
-    @java.lang.Override
-    public policy.PolicyCondition.PolicyRuleCondition getConditionList(int index) {
-      return conditionList_.get(index);
-    }
+    int getDeviceListCount();
     /**
      * <pre>
-     * One or more conditions must be met
+     * Affected device(s)
      * </pre>
      *
-     * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
-    @java.lang.Override
-    public policy.PolicyCondition.PolicyRuleConditionOrBuilder getConditionListOrBuilder(
-        int index) {
-      return conditionList_.get(index);
-    }
-
-    public static final int BOOLEANOPERATOR_FIELD_NUMBER = 6;
-    private int booleanOperator_;
+    java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+        getDeviceListOrBuilderList();
     /**
      * <pre>
-     * Evaluation operator to be used
+     * Affected device(s)
      * </pre>
      *
-     * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-     * @return The enum numeric value on the wire for booleanOperator.
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
-    @java.lang.Override public int getBooleanOperatorValue() {
-      return booleanOperator_;
+    context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * Device-oriented policy rule
+   * </pre>
+   *
+   * Protobuf type {@code policy.PolicyRuleDevice}
+   */
+  public static final class PolicyRuleDevice extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
+      PolicyRuleDeviceOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use PolicyRuleDevice.newBuilder() to construct.
+    private PolicyRuleDevice(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
     }
-    /**
-     * <pre>
-     * Evaluation operator to be used
-     * </pre>
-     *
-     * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-     * @return The booleanOperator.
-     */
-    @java.lang.Override public policy.PolicyCondition.BooleanOperator getBooleanOperator() {
-      @SuppressWarnings("deprecation")
-      policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.valueOf(booleanOperator_);
-      return result == null ? policy.PolicyCondition.BooleanOperator.UNRECOGNIZED : result;
+    private PolicyRuleDevice() {
+      deviceList_ = java.util.Collections.emptyList();
     }
 
-    public static final int ACTIONLIST_FIELD_NUMBER = 7;
-    private java.util.List<policy.PolicyAction.PolicyRuleAction> actionList_;
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    @java.lang.Override
-    public java.util.List<policy.PolicyAction.PolicyRuleAction> getActionListList() {
-      return actionList_;
-    }
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends policy.PolicyAction.PolicyRuleActionOrBuilder> 
-        getActionListOrBuilderList() {
-      return actionList_;
-    }
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
     @java.lang.Override
-    public int getActionListCount() {
-      return actionList_.size();
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new PolicyRuleDevice();
     }
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
+
     @java.lang.Override
-    public policy.PolicyAction.PolicyRuleAction getActionList(int index) {
-      return actionList_.get(index);
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
     }
-    /**
-     * <pre>
-     * One or more actions should be applied
-     * </pre>
-     *
-     * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-     */
+    private PolicyRuleDevice(
+        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: {
+              policy.Policy.PolicyRuleBasic.Builder subBuilder = null;
+              if (policyRuleBasic_ != null) {
+                subBuilder = policyRuleBasic_.toBuilder();
+              }
+              policyRuleBasic_ = input.readMessage(policy.Policy.PolicyRuleBasic.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(policyRuleBasic_);
+                policyRuleBasic_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                deviceList_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              deviceList_.add(
+                  input.readMessage(context.ContextOuterClass.DeviceId.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)) {
+          deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return policy.Policy.internal_static_policy_PolicyRuleDevice_descriptor;
+    }
+
     @java.lang.Override
-    public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(
-        int index) {
-      return actionList_.get(index);
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return policy.Policy.internal_static_policy_PolicyRuleDevice_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              policy.Policy.PolicyRuleDevice.class, policy.Policy.PolicyRuleDevice.Builder.class);
     }
 
-    public static final int SERVICEID_FIELD_NUMBER = 8;
-    private context.ContextOuterClass.ServiceId serviceId_;
+    public static final int POLICYRULEBASIC_FIELD_NUMBER = 1;
+    private policy.Policy.PolicyRuleBasic policyRuleBasic_;
     /**
      * <pre>
-     * Affected service and devices
+     * Basic policy rule attributes
      * </pre>
      *
-     * <code>.context.ServiceId serviceId = 8;</code>
-     * @return Whether the serviceId field is set.
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return Whether the policyRuleBasic field is set.
      */
     @java.lang.Override
-    public boolean hasServiceId() {
-      return serviceId_ != null;
+    public boolean hasPolicyRuleBasic() {
+      return policyRuleBasic_ != null;
     }
     /**
      * <pre>
-     * Affected service and devices
+     * Basic policy rule attributes
      * </pre>
      *
-     * <code>.context.ServiceId serviceId = 8;</code>
-     * @return The serviceId.
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+     * @return The policyRuleBasic.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceId getServiceId() {
-      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+    public policy.Policy.PolicyRuleBasic getPolicyRuleBasic() {
+      return policyRuleBasic_ == null ? policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
     }
     /**
      * <pre>
-     * Affected service and devices
+     * Basic policy rule attributes
      * </pre>
      *
-     * <code>.context.ServiceId serviceId = 8;</code>
+     * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-      return getServiceId();
+    public policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder() {
+      return getPolicyRuleBasic();
     }
 
-    public static final int DEVICELIST_FIELD_NUMBER = 9;
+    public static final int DEVICELIST_FIELD_NUMBER = 2;
     private java.util.List<context.ContextOuterClass.DeviceId> deviceList_;
     /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
+     * <pre>
+     * Affected device(s)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
     @java.lang.Override
     public java.util.List<context.ContextOuterClass.DeviceId> getDeviceListList() {
       return deviceList_;
     }
     /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
+     * <pre>
+     * Affected device(s)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
     @java.lang.Override
     public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
@@ -2985,21 +5147,33 @@ public final class Policy {
       return deviceList_;
     }
     /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
+     * <pre>
+     * Affected device(s)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
     @java.lang.Override
     public int getDeviceListCount() {
       return deviceList_.size();
     }
     /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
+     * <pre>
+     * Affected device(s)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.DeviceId getDeviceList(int index) {
       return deviceList_.get(index);
     }
     /**
-     * <code>repeated .context.DeviceId deviceList = 9;</code>
+     * <pre>
+     * Affected device(s)
+     * </pre>
+     *
+     * <code>repeated .context.DeviceId deviceList = 2;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
@@ -3021,32 +5195,11 @@ public final class Policy {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (policyRuleId_ != null) {
-        output.writeMessage(1, getPolicyRuleId());
-      }
-      if (policyRuleType_ != policy.Policy.PolicyRuleType.POLICYTYPE_DEVICE.getNumber()) {
-        output.writeEnum(2, policyRuleType_);
-      }
-      if (priority_ != 0) {
-        output.writeUInt32(3, priority_);
-      }
-      if (event_ != null) {
-        output.writeMessage(4, getEvent());
-      }
-      for (int i = 0; i < conditionList_.size(); i++) {
-        output.writeMessage(5, conditionList_.get(i));
-      }
-      if (booleanOperator_ != policy.PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED.getNumber()) {
-        output.writeEnum(6, booleanOperator_);
-      }
-      for (int i = 0; i < actionList_.size(); i++) {
-        output.writeMessage(7, actionList_.get(i));
-      }
-      if (serviceId_ != null) {
-        output.writeMessage(8, getServiceId());
+      if (policyRuleBasic_ != null) {
+        output.writeMessage(1, getPolicyRuleBasic());
       }
       for (int i = 0; i < deviceList_.size(); i++) {
-        output.writeMessage(9, deviceList_.get(i));
+        output.writeMessage(2, deviceList_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -3057,41 +5210,13 @@ public final class Policy {
       if (size != -1) return size;
 
       size = 0;
-      if (policyRuleId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getPolicyRuleId());
-      }
-      if (policyRuleType_ != policy.Policy.PolicyRuleType.POLICYTYPE_DEVICE.getNumber()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(2, policyRuleType_);
-      }
-      if (priority_ != 0) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(3, priority_);
-      }
-      if (event_ != null) {
+      if (policyRuleBasic_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, getEvent());
-      }
-      for (int i = 0; i < conditionList_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, conditionList_.get(i));
-      }
-      if (booleanOperator_ != policy.PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED.getNumber()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(6, booleanOperator_);
-      }
-      for (int i = 0; i < actionList_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, actionList_.get(i));
-      }
-      if (serviceId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(8, getServiceId());
+          .computeMessageSize(1, getPolicyRuleBasic());
       }
       for (int i = 0; i < deviceList_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(9, deviceList_.get(i));
+          .computeMessageSize(2, deviceList_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -3103,33 +5228,15 @@ public final class Policy {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof policy.Policy.PolicyRule)) {
+      if (!(obj instanceof policy.Policy.PolicyRuleDevice)) {
         return super.equals(obj);
       }
-      policy.Policy.PolicyRule other = (policy.Policy.PolicyRule) obj;
+      policy.Policy.PolicyRuleDevice other = (policy.Policy.PolicyRuleDevice) obj;
 
-      if (hasPolicyRuleId() != other.hasPolicyRuleId()) return false;
-      if (hasPolicyRuleId()) {
-        if (!getPolicyRuleId()
-            .equals(other.getPolicyRuleId())) return false;
-      }
-      if (policyRuleType_ != other.policyRuleType_) return false;
-      if (getPriority()
-          != other.getPriority()) return false;
-      if (hasEvent() != other.hasEvent()) return false;
-      if (hasEvent()) {
-        if (!getEvent()
-            .equals(other.getEvent())) return false;
-      }
-      if (!getConditionListList()
-          .equals(other.getConditionListList())) return false;
-      if (booleanOperator_ != other.booleanOperator_) return false;
-      if (!getActionListList()
-          .equals(other.getActionListList())) return false;
-      if (hasServiceId() != other.hasServiceId()) return false;
-      if (hasServiceId()) {
-        if (!getServiceId()
-            .equals(other.getServiceId())) return false;
+      if (hasPolicyRuleBasic() != other.hasPolicyRuleBasic()) return false;
+      if (hasPolicyRuleBasic()) {
+        if (!getPolicyRuleBasic()
+            .equals(other.getPolicyRuleBasic())) return false;
       }
       if (!getDeviceListList()
           .equals(other.getDeviceListList())) return false;
@@ -3144,31 +5251,9 @@ public final class Policy {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasPolicyRuleId()) {
-        hash = (37 * hash) + POLICYRULEID_FIELD_NUMBER;
-        hash = (53 * hash) + getPolicyRuleId().hashCode();
-      }
-      hash = (37 * hash) + POLICYRULETYPE_FIELD_NUMBER;
-      hash = (53 * hash) + policyRuleType_;
-      hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
-      hash = (53 * hash) + getPriority();
-      if (hasEvent()) {
-        hash = (37 * hash) + EVENT_FIELD_NUMBER;
-        hash = (53 * hash) + getEvent().hashCode();
-      }
-      if (getConditionListCount() > 0) {
-        hash = (37 * hash) + CONDITIONLIST_FIELD_NUMBER;
-        hash = (53 * hash) + getConditionListList().hashCode();
-      }
-      hash = (37 * hash) + BOOLEANOPERATOR_FIELD_NUMBER;
-      hash = (53 * hash) + booleanOperator_;
-      if (getActionListCount() > 0) {
-        hash = (37 * hash) + ACTIONLIST_FIELD_NUMBER;
-        hash = (53 * hash) + getActionListList().hashCode();
-      }
-      if (hasServiceId()) {
-        hash = (37 * hash) + SERVICEID_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceId().hashCode();
+      if (hasPolicyRuleBasic()) {
+        hash = (37 * hash) + POLICYRULEBASIC_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleBasic().hashCode();
       }
       if (getDeviceListCount() > 0) {
         hash = (37 * hash) + DEVICELIST_FIELD_NUMBER;
@@ -3179,69 +5264,69 @@ public final class Policy {
       return hash;
     }
 
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRule parseFrom(byte[] data)
+    public static policy.Policy.PolicyRuleDevice parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRule parseFrom(java.io.InputStream input)
+    public static policy.Policy.PolicyRuleDevice parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice 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 policy.Policy.PolicyRule parseDelimitedFrom(java.io.InputStream input)
+    public static policy.Policy.PolicyRuleDevice parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRule parseDelimitedFrom(
+    public static policy.Policy.PolicyRuleDevice 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 policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRule parseFrom(
+    public static policy.Policy.PolicyRuleDevice parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -3254,7 +5339,7 @@ public final class Policy {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(policy.Policy.PolicyRule prototype) {
+    public static Builder newBuilder(policy.Policy.PolicyRuleDevice prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -3271,32 +5356,29 @@ public final class Policy {
     }
     /**
      * <pre>
-     * Policy rule partially complies with IETF’s:
-     *     RFC 3060: https://datatracker.ietf.org/doc/html/rfc3060
-     *     RFC 3460: https://datatracker.ietf.org/doc/html/rfc3460
-     * Enhanced with a policy rule event according to the ECA model
+     * Device-oriented policy rule
      * </pre>
      *
-     * Protobuf type {@code policy.PolicyRule}
+     * Protobuf type {@code policy.PolicyRuleDevice}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
-        policy.Policy.PolicyRuleOrBuilder {
+        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
+        policy.Policy.PolicyRuleDeviceOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return policy.Policy.internal_static_policy_PolicyRule_descriptor;
+        return policy.Policy.internal_static_policy_PolicyRuleDevice_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return policy.Policy.internal_static_policy_PolicyRule_fieldAccessorTable
+        return policy.Policy.internal_static_policy_PolicyRuleDevice_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                policy.Policy.PolicyRule.class, policy.Policy.PolicyRule.Builder.class);
+                policy.Policy.PolicyRuleDevice.class, policy.Policy.PolicyRuleDevice.Builder.class);
       }
 
-      // Construct using policy.Policy.PolicyRule.newBuilder()
+      // Construct using policy.Policy.PolicyRuleDevice.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -3309,53 +5391,21 @@ public final class Policy {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getConditionListFieldBuilder();
-          getActionListFieldBuilder();
           getDeviceListFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleId_ = null;
-        } else {
-          policyRuleId_ = null;
-          policyRuleIdBuilder_ = null;
-        }
-        policyRuleType_ = 0;
-
-        priority_ = 0;
-
-        if (eventBuilder_ == null) {
-          event_ = null;
-        } else {
-          event_ = null;
-          eventBuilder_ = null;
-        }
-        if (conditionListBuilder_ == null) {
-          conditionList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-        } else {
-          conditionListBuilder_.clear();
-        }
-        booleanOperator_ = 0;
-
-        if (actionListBuilder_ == null) {
-          actionList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-        } else {
-          actionListBuilder_.clear();
-        }
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasic_ = null;
         } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
+          policyRuleBasic_ = null;
+          policyRuleBasicBuilder_ = null;
         }
         if (deviceListBuilder_ == null) {
           deviceList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000004);
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
           deviceListBuilder_.clear();
         }
@@ -3365,17 +5415,17 @@ public final class Policy {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return policy.Policy.internal_static_policy_PolicyRule_descriptor;
+        return policy.Policy.internal_static_policy_PolicyRuleDevice_descriptor;
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRule getDefaultInstanceForType() {
-        return policy.Policy.PolicyRule.getDefaultInstance();
+      public policy.Policy.PolicyRuleDevice getDefaultInstanceForType() {
+        return policy.Policy.PolicyRuleDevice.getDefaultInstance();
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRule build() {
-        policy.Policy.PolicyRule result = buildPartial();
+      public policy.Policy.PolicyRuleDevice build() {
+        policy.Policy.PolicyRuleDevice result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -3383,49 +5433,18 @@ public final class Policy {
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRule buildPartial() {
-        policy.Policy.PolicyRule result = new policy.Policy.PolicyRule(this);
+      public policy.Policy.PolicyRuleDevice buildPartial() {
+        policy.Policy.PolicyRuleDevice result = new policy.Policy.PolicyRuleDevice(this);
         int from_bitField0_ = bitField0_;
-        if (policyRuleIdBuilder_ == null) {
-          result.policyRuleId_ = policyRuleId_;
-        } else {
-          result.policyRuleId_ = policyRuleIdBuilder_.build();
-        }
-        result.policyRuleType_ = policyRuleType_;
-        result.priority_ = priority_;
-        if (eventBuilder_ == null) {
-          result.event_ = event_;
-        } else {
-          result.event_ = eventBuilder_.build();
-        }
-        if (conditionListBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            conditionList_ = java.util.Collections.unmodifiableList(conditionList_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.conditionList_ = conditionList_;
+        if (policyRuleBasicBuilder_ == null) {
+          result.policyRuleBasic_ = policyRuleBasic_;
         } else {
-          result.conditionList_ = conditionListBuilder_.build();
-        }
-        result.booleanOperator_ = booleanOperator_;
-        if (actionListBuilder_ == null) {
-          if (((bitField0_ & 0x00000002) != 0)) {
-            actionList_ = java.util.Collections.unmodifiableList(actionList_);
-            bitField0_ = (bitField0_ & ~0x00000002);
-          }
-          result.actionList_ = actionList_;
-        } else {
-          result.actionList_ = actionListBuilder_.build();
-        }
-        if (serviceIdBuilder_ == null) {
-          result.serviceId_ = serviceId_;
-        } else {
-          result.serviceId_ = serviceIdBuilder_.build();
+          result.policyRuleBasic_ = policyRuleBasicBuilder_.build();
         }
         if (deviceListBuilder_ == null) {
-          if (((bitField0_ & 0x00000004) != 0)) {
+          if (((bitField0_ & 0x00000001) != 0)) {
             deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
-            bitField0_ = (bitField0_ & ~0x00000004);
+            bitField0_ = (bitField0_ & ~0x00000001);
           }
           result.deviceList_ = deviceList_;
         } else {
@@ -3461,99 +5480,32 @@ public final class Policy {
           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 policy.Policy.PolicyRule) {
-          return mergeFrom((policy.Policy.PolicyRule)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(policy.Policy.PolicyRule other) {
-        if (other == policy.Policy.PolicyRule.getDefaultInstance()) return this;
-        if (other.hasPolicyRuleId()) {
-          mergePolicyRuleId(other.getPolicyRuleId());
-        }
-        if (other.policyRuleType_ != 0) {
-          setPolicyRuleTypeValue(other.getPolicyRuleTypeValue());
-        }
-        if (other.getPriority() != 0) {
-          setPriority(other.getPriority());
-        }
-        if (other.hasEvent()) {
-          mergeEvent(other.getEvent());
-        }
-        if (conditionListBuilder_ == null) {
-          if (!other.conditionList_.isEmpty()) {
-            if (conditionList_.isEmpty()) {
-              conditionList_ = other.conditionList_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureConditionListIsMutable();
-              conditionList_.addAll(other.conditionList_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.conditionList_.isEmpty()) {
-            if (conditionListBuilder_.isEmpty()) {
-              conditionListBuilder_.dispose();
-              conditionListBuilder_ = null;
-              conditionList_ = other.conditionList_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              conditionListBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getConditionListFieldBuilder() : null;
-            } else {
-              conditionListBuilder_.addAllMessages(other.conditionList_);
-            }
-          }
-        }
-        if (other.booleanOperator_ != 0) {
-          setBooleanOperatorValue(other.getBooleanOperatorValue());
-        }
-        if (actionListBuilder_ == null) {
-          if (!other.actionList_.isEmpty()) {
-            if (actionList_.isEmpty()) {
-              actionList_ = other.actionList_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-            } else {
-              ensureActionListIsMutable();
-              actionList_.addAll(other.actionList_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.actionList_.isEmpty()) {
-            if (actionListBuilder_.isEmpty()) {
-              actionListBuilder_.dispose();
-              actionListBuilder_ = null;
-              actionList_ = other.actionList_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              actionListBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getActionListFieldBuilder() : null;
-            } else {
-              actionListBuilder_.addAllMessages(other.actionList_);
-            }
-          }
+      @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 policy.Policy.PolicyRuleDevice) {
+          return mergeFrom((policy.Policy.PolicyRuleDevice)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
         }
-        if (other.hasServiceId()) {
-          mergeServiceId(other.getServiceId());
+      }
+
+      public Builder mergeFrom(policy.Policy.PolicyRuleDevice other) {
+        if (other == policy.Policy.PolicyRuleDevice.getDefaultInstance()) return this;
+        if (other.hasPolicyRuleBasic()) {
+          mergePolicyRuleBasic(other.getPolicyRuleBasic());
         }
         if (deviceListBuilder_ == null) {
           if (!other.deviceList_.isEmpty()) {
             if (deviceList_.isEmpty()) {
               deviceList_ = other.deviceList_;
-              bitField0_ = (bitField0_ & ~0x00000004);
+              bitField0_ = (bitField0_ & ~0x00000001);
             } else {
               ensureDeviceListIsMutable();
               deviceList_.addAll(other.deviceList_);
@@ -3566,7 +5518,7 @@ public final class Policy {
               deviceListBuilder_.dispose();
               deviceListBuilder_ = null;
               deviceList_ = other.deviceList_;
-              bitField0_ = (bitField0_ & ~0x00000004);
+              bitField0_ = (bitField0_ & ~0x00000001);
               deviceListBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                    getDeviceListFieldBuilder() : null;
@@ -3590,11 +5542,11 @@ public final class Policy {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        policy.Policy.PolicyRule parsedMessage = null;
+        policy.Policy.PolicyRuleDevice parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (policy.Policy.PolicyRule) e.getUnfinishedMessage();
+          parsedMessage = (policy.Policy.PolicyRuleDevice) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -3605,33 +5557,33 @@ public final class Policy {
       }
       private int bitField0_;
 
-      private policy.Policy.PolicyRuleId policyRuleId_;
+      private policy.Policy.PolicyRuleBasic policyRuleBasic_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder> policyRuleIdBuilder_;
+          policy.Policy.PolicyRuleBasic, policy.Policy.PolicyRuleBasic.Builder, policy.Policy.PolicyRuleBasicOrBuilder> policyRuleBasicBuilder_;
       /**
        * <pre>
        * Basic policy rule attributes
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-       * @return Whether the policyRuleId field is set.
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       * @return Whether the policyRuleBasic field is set.
        */
-      public boolean hasPolicyRuleId() {
-        return policyRuleIdBuilder_ != null || policyRuleId_ != null;
+      public boolean hasPolicyRuleBasic() {
+        return policyRuleBasicBuilder_ != null || policyRuleBasic_ != null;
       }
       /**
        * <pre>
        * Basic policy rule attributes
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
-       * @return The policyRuleId.
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       * @return The policyRuleBasic.
        */
-      public policy.Policy.PolicyRuleId getPolicyRuleId() {
-        if (policyRuleIdBuilder_ == null) {
-          return policyRuleId_ == null ? policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
+      public policy.Policy.PolicyRuleBasic getPolicyRuleBasic() {
+        if (policyRuleBasicBuilder_ == null) {
+          return policyRuleBasic_ == null ? policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
         } else {
-          return policyRuleIdBuilder_.getMessage();
+          return policyRuleBasicBuilder_.getMessage();
         }
       }
       /**
@@ -3639,1458 +5591,2039 @@ public final class Policy {
        * Basic policy rule attributes
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
        */
-      public Builder setPolicyRuleId(policy.Policy.PolicyRuleId value) {
-        if (policyRuleIdBuilder_ == null) {
+      public Builder setPolicyRuleBasic(policy.Policy.PolicyRuleBasic value) {
+        if (policyRuleBasicBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          policyRuleId_ = value;
+          policyRuleBasic_ = value;
           onChanged();
         } else {
-          policyRuleIdBuilder_.setMessage(value);
+          policyRuleBasicBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder setPolicyRuleBasic(
+          policy.Policy.PolicyRuleBasic.Builder builderForValue) {
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasic_ = builderForValue.build();
+          onChanged();
+        } else {
+          policyRuleBasicBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder mergePolicyRuleBasic(policy.Policy.PolicyRuleBasic value) {
+        if (policyRuleBasicBuilder_ == null) {
+          if (policyRuleBasic_ != null) {
+            policyRuleBasic_ =
+              policy.Policy.PolicyRuleBasic.newBuilder(policyRuleBasic_).mergeFrom(value).buildPartial();
+          } else {
+            policyRuleBasic_ = value;
+          }
+          onChanged();
+        } else {
+          policyRuleBasicBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public Builder clearPolicyRuleBasic() {
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasic_ = null;
+          onChanged();
+        } else {
+          policyRuleBasic_ = null;
+          policyRuleBasicBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public policy.Policy.PolicyRuleBasic.Builder getPolicyRuleBasicBuilder() {
+        
+        onChanged();
+        return getPolicyRuleBasicFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      public policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder() {
+        if (policyRuleBasicBuilder_ != null) {
+          return policyRuleBasicBuilder_.getMessageOrBuilder();
+        } else {
+          return policyRuleBasic_ == null ?
+              policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
+        }
+      }
+      /**
+       * <pre>
+       * Basic policy rule attributes
+       * </pre>
+       *
+       * <code>.policy.PolicyRuleBasic policyRuleBasic = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          policy.Policy.PolicyRuleBasic, policy.Policy.PolicyRuleBasic.Builder, policy.Policy.PolicyRuleBasicOrBuilder> 
+          getPolicyRuleBasicFieldBuilder() {
+        if (policyRuleBasicBuilder_ == null) {
+          policyRuleBasicBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              policy.Policy.PolicyRuleBasic, policy.Policy.PolicyRuleBasic.Builder, policy.Policy.PolicyRuleBasicOrBuilder>(
+                  getPolicyRuleBasic(),
+                  getParentForChildren(),
+                  isClean());
+          policyRuleBasic_ = null;
+        }
+        return policyRuleBasicBuilder_;
+      }
+
+      private java.util.List<context.ContextOuterClass.DeviceId> deviceList_ =
+        java.util.Collections.emptyList();
+      private void ensureDeviceListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          deviceList_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>(deviceList_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceListBuilder_;
+
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public java.util.List<context.ContextOuterClass.DeviceId> getDeviceListList() {
+        if (deviceListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(deviceList_);
+        } else {
+          return deviceListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public int getDeviceListCount() {
+        if (deviceListBuilder_ == null) {
+          return deviceList_.size();
+        } else {
+          return deviceListBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceId getDeviceList(int index) {
+        if (deviceListBuilder_ == null) {
+          return deviceList_.get(index);
+        } else {
+          return deviceListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public Builder setDeviceList(
+          int index, context.ContextOuterClass.DeviceId value) {
+        if (deviceListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceListIsMutable();
+          deviceList_.set(index, value);
+          onChanged();
+        } else {
+          deviceListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public Builder setDeviceList(
+          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          deviceListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public Builder addDeviceList(context.ContextOuterClass.DeviceId value) {
+        if (deviceListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceListIsMutable();
+          deviceList_.add(value);
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public Builder addDeviceList(
+          int index, context.ContextOuterClass.DeviceId value) {
+        if (deviceListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceListIsMutable();
+          deviceList_.add(index, value);
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public Builder addDeviceList(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
+       */
+      public Builder addDeviceList(
+          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          deviceListBuilder_.addMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
        * <pre>
-       * Basic policy rule attributes
+       * Affected device(s)
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      public Builder setPolicyRuleId(
-          policy.Policy.PolicyRuleId.Builder builderForValue) {
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleId_ = builderForValue.build();
+      public Builder addAllDeviceList(
+          java.lang.Iterable<? extends context.ContextOuterClass.DeviceId> values) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, deviceList_);
           onChanged();
         } else {
-          policyRuleIdBuilder_.setMessage(builderForValue.build());
+          deviceListBuilder_.addAllMessages(values);
         }
-
         return this;
       }
       /**
        * <pre>
-       * Basic policy rule attributes
+       * Affected device(s)
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      public Builder mergePolicyRuleId(policy.Policy.PolicyRuleId value) {
-        if (policyRuleIdBuilder_ == null) {
-          if (policyRuleId_ != null) {
-            policyRuleId_ =
-              policy.Policy.PolicyRuleId.newBuilder(policyRuleId_).mergeFrom(value).buildPartial();
-          } else {
-            policyRuleId_ = value;
-          }
+      public Builder clearDeviceList() {
+        if (deviceListBuilder_ == null) {
+          deviceList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          policyRuleIdBuilder_.mergeFrom(value);
+          deviceListBuilder_.clear();
         }
-
         return this;
       }
       /**
        * <pre>
-       * Basic policy rule attributes
+       * Affected device(s)
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      public Builder clearPolicyRuleId() {
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleId_ = null;
+      public Builder removeDeviceList(int index) {
+        if (deviceListBuilder_ == null) {
+          ensureDeviceListIsMutable();
+          deviceList_.remove(index);
           onChanged();
         } else {
-          policyRuleId_ = null;
-          policyRuleIdBuilder_ = null;
+          deviceListBuilder_.remove(index);
         }
-
         return this;
       }
       /**
        * <pre>
-       * Basic policy rule attributes
+       * Affected device(s)
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      public policy.Policy.PolicyRuleId.Builder getPolicyRuleIdBuilder() {
-        
-        onChanged();
-        return getPolicyRuleIdFieldBuilder().getBuilder();
+      public context.ContextOuterClass.DeviceId.Builder getDeviceListBuilder(
+          int index) {
+        return getDeviceListFieldBuilder().getBuilder(index);
       }
       /**
        * <pre>
-       * Basic policy rule attributes
+       * Affected device(s)
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder() {
-        if (policyRuleIdBuilder_ != null) {
-          return policyRuleIdBuilder_.getMessageOrBuilder();
-        } else {
-          return policyRuleId_ == null ?
-              policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
+      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
+          int index) {
+        if (deviceListBuilder_ == null) {
+          return deviceList_.get(index);  } else {
+          return deviceListBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
        * <pre>
-       * Basic policy rule attributes
+       * Affected device(s)
        * </pre>
        *
-       * <code>.policy.PolicyRuleId policyRuleId = 1;</code>
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder> 
-          getPolicyRuleIdFieldBuilder() {
-        if (policyRuleIdBuilder_ == null) {
-          policyRuleIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder>(
-                  getPolicyRuleId(),
-                  getParentForChildren(),
-                  isClean());
-          policyRuleId_ = null;
+      public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+           getDeviceListOrBuilderList() {
+        if (deviceListBuilder_ != null) {
+          return deviceListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(deviceList_);
         }
-        return policyRuleIdBuilder_;
       }
-
-      private int policyRuleType_ = 0;
       /**
-       * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-       * @return The enum numeric value on the wire for policyRuleType.
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      @java.lang.Override public int getPolicyRuleTypeValue() {
-        return policyRuleType_;
+      public context.ContextOuterClass.DeviceId.Builder addDeviceListBuilder() {
+        return getDeviceListFieldBuilder().addBuilder(
+            context.ContextOuterClass.DeviceId.getDefaultInstance());
       }
       /**
-       * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-       * @param value The enum numeric value on the wire for policyRuleType to set.
-       * @return This builder for chaining.
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      public Builder setPolicyRuleTypeValue(int value) {
-        
-        policyRuleType_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.DeviceId.Builder addDeviceListBuilder(
+          int index) {
+        return getDeviceListFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.DeviceId.getDefaultInstance());
       }
       /**
-       * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-       * @return The policyRuleType.
+       * <pre>
+       * Affected device(s)
+       * </pre>
+       *
+       * <code>repeated .context.DeviceId deviceList = 2;</code>
        */
-      @java.lang.Override
-      public policy.Policy.PolicyRuleType getPolicyRuleType() {
-        @SuppressWarnings("deprecation")
-        policy.Policy.PolicyRuleType result = policy.Policy.PolicyRuleType.valueOf(policyRuleType_);
-        return result == null ? policy.Policy.PolicyRuleType.UNRECOGNIZED : result;
+      public java.util.List<context.ContextOuterClass.DeviceId.Builder> 
+           getDeviceListBuilderList() {
+        return getDeviceListFieldBuilder().getBuilderList();
       }
-      /**
-       * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-       * @param value The policyRuleType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setPolicyRuleType(policy.Policy.PolicyRuleType value) {
-        if (value == null) {
-          throw new NullPointerException();
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getDeviceListFieldBuilder() {
+        if (deviceListBuilder_ == null) {
+          deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  deviceList_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          deviceList_ = null;
         }
-        
-        policyRuleType_ = value.getNumber();
-        onChanged();
-        return this;
+        return deviceListBuilder_;
       }
-      /**
-       * <code>.policy.PolicyRuleType policyRuleType = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearPolicyRuleType() {
-        
-        policyRuleType_ = 0;
-        onChanged();
-        return this;
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
       }
 
-      private int priority_ ;
-      /**
-       * <code>uint32 priority = 3;</code>
-       * @return The priority.
-       */
       @java.lang.Override
-      public int getPriority() {
-        return priority_;
-      }
-      /**
-       * <code>uint32 priority = 3;</code>
-       * @param value The priority to set.
-       * @return This builder for chaining.
-       */
-      public Builder setPriority(int value) {
-        
-        priority_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>uint32 priority = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearPriority() {
-        
-        priority_ = 0;
-        onChanged();
-        return this;
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
       }
 
-      private policy.Policy.PolicyRuleEvent event_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          policy.Policy.PolicyRuleEvent, policy.Policy.PolicyRuleEvent.Builder, policy.Policy.PolicyRuleEventOrBuilder> eventBuilder_;
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       * @return Whether the event field is set.
-       */
-      public boolean hasEvent() {
-        return eventBuilder_ != null || event_ != null;
+
+      // @@protoc_insertion_point(builder_scope:policy.PolicyRuleDevice)
+    }
+
+    // @@protoc_insertion_point(class_scope:policy.PolicyRuleDevice)
+    private static final policy.Policy.PolicyRuleDevice DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleDevice();
+    }
+
+    public static policy.Policy.PolicyRuleDevice getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<PolicyRuleDevice>
+        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleDevice>() {
+      @java.lang.Override
+      public PolicyRuleDevice parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new PolicyRuleDevice(input, extensionRegistry);
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       * @return The event.
-       */
-      public policy.Policy.PolicyRuleEvent getEvent() {
-        if (eventBuilder_ == null) {
-          return event_ == null ? policy.Policy.PolicyRuleEvent.getDefaultInstance() : event_;
-        } else {
-          return eventBuilder_.getMessage();
-        }
+    };
+
+    public static com.google.protobuf.Parser<PolicyRuleDevice> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<PolicyRuleDevice> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public policy.Policy.PolicyRuleDevice getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface PolicyRuleIdListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleIdList)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    java.util.List<policy.Policy.PolicyRuleId> 
+        getPolicyRuleIdListList();
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    policy.Policy.PolicyRuleId getPolicyRuleIdList(int index);
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    int getPolicyRuleIdListCount();
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    java.util.List<? extends policy.Policy.PolicyRuleIdOrBuilder> 
+        getPolicyRuleIdListOrBuilderList();
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdListOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * A list of policy rule IDs
+   * </pre>
+   *
+   * Protobuf type {@code policy.PolicyRuleIdList}
+   */
+  public static final class PolicyRuleIdList extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
+      PolicyRuleIdListOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use PolicyRuleIdList.newBuilder() to construct.
+    private PolicyRuleIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private PolicyRuleIdList() {
+      policyRuleIdList_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new PolicyRuleIdList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private PolicyRuleIdList(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      public Builder setEvent(policy.Policy.PolicyRuleEvent value) {
-        if (eventBuilder_ == null) {
-          if (value == null) {
-            throw new 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)) {
+                policyRuleIdList_ = new java.util.ArrayList<policy.Policy.PolicyRuleId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              policyRuleIdList_.add(
+                  input.readMessage(policy.Policy.PolicyRuleId.parser(), extensionRegistry));
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
           }
-          event_ = value;
-          onChanged();
-        } else {
-          eventBuilder_.setMessage(value);
         }
-
-        return this;
-      }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      public Builder setEvent(
-          policy.Policy.PolicyRuleEvent.Builder builderForValue) {
-        if (eventBuilder_ == null) {
-          event_ = builderForValue.build();
-          onChanged();
-        } else {
-          eventBuilder_.setMessage(builderForValue.build());
+      } 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)) {
+          policyRuleIdList_ = java.util.Collections.unmodifiableList(policyRuleIdList_);
         }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return policy.Policy.internal_static_policy_PolicyRuleIdList_descriptor;
+    }
 
-        return this;
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return policy.Policy.internal_static_policy_PolicyRuleIdList_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              policy.Policy.PolicyRuleIdList.class, policy.Policy.PolicyRuleIdList.Builder.class);
+    }
+
+    public static final int POLICYRULEIDLIST_FIELD_NUMBER = 1;
+    private java.util.List<policy.Policy.PolicyRuleId> policyRuleIdList_;
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<policy.Policy.PolicyRuleId> getPolicyRuleIdListList() {
+      return policyRuleIdList_;
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends policy.Policy.PolicyRuleIdOrBuilder> 
+        getPolicyRuleIdListOrBuilderList() {
+      return policyRuleIdList_;
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    @java.lang.Override
+    public int getPolicyRuleIdListCount() {
+      return policyRuleIdList_.size();
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleId getPolicyRuleIdList(int index) {
+      return policyRuleIdList_.get(index);
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdListOrBuilder(
+        int index) {
+      return policyRuleIdList_.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 < policyRuleIdList_.size(); i++) {
+        output.writeMessage(1, policyRuleIdList_.get(i));
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      public Builder mergeEvent(policy.Policy.PolicyRuleEvent value) {
-        if (eventBuilder_ == null) {
-          if (event_ != null) {
-            event_ =
-              policy.Policy.PolicyRuleEvent.newBuilder(event_).mergeFrom(value).buildPartial();
-          } else {
-            event_ = value;
-          }
-          onChanged();
-        } else {
-          eventBuilder_.mergeFrom(value);
-        }
+      unknownFields.writeTo(output);
+    }
 
-        return this;
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < policyRuleIdList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, policyRuleIdList_.get(i));
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      public Builder clearEvent() {
-        if (eventBuilder_ == null) {
-          event_ = null;
-          onChanged();
-        } else {
-          event_ = null;
-          eventBuilder_ = null;
-        }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
 
-        return this;
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      public policy.Policy.PolicyRuleEvent.Builder getEventBuilder() {
-        
-        onChanged();
-        return getEventFieldBuilder().getBuilder();
+      if (!(obj instanceof policy.Policy.PolicyRuleIdList)) {
+        return super.equals(obj);
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      public policy.Policy.PolicyRuleEventOrBuilder getEventOrBuilder() {
-        if (eventBuilder_ != null) {
-          return eventBuilder_.getMessageOrBuilder();
-        } else {
-          return event_ == null ?
-              policy.Policy.PolicyRuleEvent.getDefaultInstance() : event_;
-        }
+      policy.Policy.PolicyRuleIdList other = (policy.Policy.PolicyRuleIdList) obj;
+
+      if (!getPolicyRuleIdListList()
+          .equals(other.getPolicyRuleIdListList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
       }
-      /**
-       * <pre>
-       * Event-Condition-Action model
-       * </pre>
-       *
-       * <code>.policy.PolicyRuleEvent event = 4;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          policy.Policy.PolicyRuleEvent, policy.Policy.PolicyRuleEvent.Builder, policy.Policy.PolicyRuleEventOrBuilder> 
-          getEventFieldBuilder() {
-        if (eventBuilder_ == null) {
-          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              policy.Policy.PolicyRuleEvent, policy.Policy.PolicyRuleEvent.Builder, policy.Policy.PolicyRuleEventOrBuilder>(
-                  getEvent(),
-                  getParentForChildren(),
-                  isClean());
-          event_ = null;
-        }
-        return eventBuilder_;
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getPolicyRuleIdListCount() > 0) {
+        hash = (37 * hash) + POLICYRULEIDLIST_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleIdListList().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static policy.Policy.PolicyRuleIdList parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleIdList parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleIdList parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleIdList parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleIdList parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleIdList parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleIdList parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleIdList 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 policy.Policy.PolicyRuleIdList parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleIdList 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 policy.Policy.PolicyRuleIdList parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleIdList 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(policy.Policy.PolicyRuleIdList 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>
+     * A list of policy rule IDs
+     * </pre>
+     *
+     * Protobuf type {@code policy.PolicyRuleIdList}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
+        policy.Policy.PolicyRuleIdListOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return policy.Policy.internal_static_policy_PolicyRuleIdList_descriptor;
       }
 
-      private java.util.List<policy.PolicyCondition.PolicyRuleCondition> conditionList_ =
-        java.util.Collections.emptyList();
-      private void ensureConditionListIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          conditionList_ = new java.util.ArrayList<policy.PolicyCondition.PolicyRuleCondition>(conditionList_);
-          bitField0_ |= 0x00000001;
-         }
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return policy.Policy.internal_static_policy_PolicyRuleIdList_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                policy.Policy.PolicyRuleIdList.class, policy.Policy.PolicyRuleIdList.Builder.class);
       }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          policy.PolicyCondition.PolicyRuleCondition, policy.PolicyCondition.PolicyRuleCondition.Builder, policy.PolicyCondition.PolicyRuleConditionOrBuilder> conditionListBuilder_;
-
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public java.util.List<policy.PolicyCondition.PolicyRuleCondition> getConditionListList() {
-        if (conditionListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(conditionList_);
-        } else {
-          return conditionListBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public int getConditionListCount() {
-        if (conditionListBuilder_ == null) {
-          return conditionList_.size();
-        } else {
-          return conditionListBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public policy.PolicyCondition.PolicyRuleCondition getConditionList(int index) {
-        if (conditionListBuilder_ == null) {
-          return conditionList_.get(index);
-        } else {
-          return conditionListBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder setConditionList(
-          int index, policy.PolicyCondition.PolicyRuleCondition value) {
-        if (conditionListBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureConditionListIsMutable();
-          conditionList_.set(index, value);
-          onChanged();
-        } else {
-          conditionListBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder setConditionList(
-          int index, policy.PolicyCondition.PolicyRuleCondition.Builder builderForValue) {
-        if (conditionListBuilder_ == null) {
-          ensureConditionListIsMutable();
-          conditionList_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          conditionListBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder addConditionList(policy.PolicyCondition.PolicyRuleCondition value) {
-        if (conditionListBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureConditionListIsMutable();
-          conditionList_.add(value);
-          onChanged();
-        } else {
-          conditionListBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder addConditionList(
-          int index, policy.PolicyCondition.PolicyRuleCondition value) {
-        if (conditionListBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureConditionListIsMutable();
-          conditionList_.add(index, value);
-          onChanged();
-        } else {
-          conditionListBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder addConditionList(
-          policy.PolicyCondition.PolicyRuleCondition.Builder builderForValue) {
-        if (conditionListBuilder_ == null) {
-          ensureConditionListIsMutable();
-          conditionList_.add(builderForValue.build());
-          onChanged();
-        } else {
-          conditionListBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
+      // Construct using policy.Policy.PolicyRuleIdList.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder addConditionList(
-          int index, policy.PolicyCondition.PolicyRuleCondition.Builder builderForValue) {
-        if (conditionListBuilder_ == null) {
-          ensureConditionListIsMutable();
-          conditionList_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          conditionListBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder addAllConditionList(
-          java.lang.Iterable<? extends policy.PolicyCondition.PolicyRuleCondition> values) {
-        if (conditionListBuilder_ == null) {
-          ensureConditionListIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, conditionList_);
-          onChanged();
-        } else {
-          conditionListBuilder_.addAllMessages(values);
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getPolicyRuleIdListFieldBuilder();
         }
-        return this;
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder clearConditionList() {
-        if (conditionListBuilder_ == null) {
-          conditionList_ = java.util.Collections.emptyList();
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (policyRuleIdListBuilder_ == null) {
+          policyRuleIdList_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
         } else {
-          conditionListBuilder_.clear();
+          policyRuleIdListBuilder_.clear();
         }
         return this;
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public Builder removeConditionList(int index) {
-        if (conditionListBuilder_ == null) {
-          ensureConditionListIsMutable();
-          conditionList_.remove(index);
-          onChanged();
-        } else {
-          conditionListBuilder_.remove(index);
-        }
-        return this;
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return policy.Policy.internal_static_policy_PolicyRuleIdList_descriptor;
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public policy.PolicyCondition.PolicyRuleCondition.Builder getConditionListBuilder(
-          int index) {
-        return getConditionListFieldBuilder().getBuilder(index);
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleIdList getDefaultInstanceForType() {
+        return policy.Policy.PolicyRuleIdList.getDefaultInstance();
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public policy.PolicyCondition.PolicyRuleConditionOrBuilder getConditionListOrBuilder(
-          int index) {
-        if (conditionListBuilder_ == null) {
-          return conditionList_.get(index);  } else {
-          return conditionListBuilder_.getMessageOrBuilder(index);
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleIdList build() {
+        policy.Policy.PolicyRuleIdList result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
         }
+        return result;
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public java.util.List<? extends policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
-           getConditionListOrBuilderList() {
-        if (conditionListBuilder_ != null) {
-          return conditionListBuilder_.getMessageOrBuilderList();
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleIdList buildPartial() {
+        policy.Policy.PolicyRuleIdList result = new policy.Policy.PolicyRuleIdList(this);
+        int from_bitField0_ = bitField0_;
+        if (policyRuleIdListBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            policyRuleIdList_ = java.util.Collections.unmodifiableList(policyRuleIdList_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.policyRuleIdList_ = policyRuleIdList_;
         } else {
-          return java.util.Collections.unmodifiableList(conditionList_);
+          result.policyRuleIdList_ = policyRuleIdListBuilder_.build();
         }
+        onBuilt();
+        return result;
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public policy.PolicyCondition.PolicyRuleCondition.Builder addConditionListBuilder() {
-        return getConditionListFieldBuilder().addBuilder(
-            policy.PolicyCondition.PolicyRuleCondition.getDefaultInstance());
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public policy.PolicyCondition.PolicyRuleCondition.Builder addConditionListBuilder(
-          int index) {
-        return getConditionListFieldBuilder().addBuilder(
-            index, policy.PolicyCondition.PolicyRuleCondition.getDefaultInstance());
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
       }
-      /**
-       * <pre>
-       * One or more conditions must be met
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleCondition conditionList = 5;</code>
-       */
-      public java.util.List<policy.PolicyCondition.PolicyRuleCondition.Builder> 
-           getConditionListBuilderList() {
-        return getConditionListFieldBuilder().getBuilderList();
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
       }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          policy.PolicyCondition.PolicyRuleCondition, policy.PolicyCondition.PolicyRuleCondition.Builder, policy.PolicyCondition.PolicyRuleConditionOrBuilder> 
-          getConditionListFieldBuilder() {
-        if (conditionListBuilder_ == null) {
-          conditionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              policy.PolicyCondition.PolicyRuleCondition, policy.PolicyCondition.PolicyRuleCondition.Builder, policy.PolicyCondition.PolicyRuleConditionOrBuilder>(
-                  conditionList_,
-                  ((bitField0_ & 0x00000001) != 0),
-                  getParentForChildren(),
-                  isClean());
-          conditionList_ = null;
-        }
-        return conditionListBuilder_;
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
       }
-
-      private int booleanOperator_ = 0;
-      /**
-       * <pre>
-       * Evaluation operator to be used
-       * </pre>
-       *
-       * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-       * @return The enum numeric value on the wire for booleanOperator.
-       */
-      @java.lang.Override public int getBooleanOperatorValue() {
-        return booleanOperator_;
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
       }
-      /**
-       * <pre>
-       * Evaluation operator to be used
-       * </pre>
-       *
-       * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-       * @param value The enum numeric value on the wire for booleanOperator to set.
-       * @return This builder for chaining.
-       */
-      public Builder setBooleanOperatorValue(int value) {
-        
-        booleanOperator_ = value;
-        onChanged();
-        return this;
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
       }
-      /**
-       * <pre>
-       * Evaluation operator to be used
-       * </pre>
-       *
-       * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-       * @return The booleanOperator.
-       */
       @java.lang.Override
-      public policy.PolicyCondition.BooleanOperator getBooleanOperator() {
-        @SuppressWarnings("deprecation")
-        policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.valueOf(booleanOperator_);
-        return result == null ? policy.PolicyCondition.BooleanOperator.UNRECOGNIZED : result;
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof policy.Policy.PolicyRuleIdList) {
+          return mergeFrom((policy.Policy.PolicyRuleIdList)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
       }
-      /**
-       * <pre>
-       * Evaluation operator to be used
-       * </pre>
-       *
-       * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-       * @param value The booleanOperator to set.
-       * @return This builder for chaining.
-       */
-      public Builder setBooleanOperator(policy.PolicyCondition.BooleanOperator value) {
-        if (value == null) {
-          throw new NullPointerException();
+
+      public Builder mergeFrom(policy.Policy.PolicyRuleIdList other) {
+        if (other == policy.Policy.PolicyRuleIdList.getDefaultInstance()) return this;
+        if (policyRuleIdListBuilder_ == null) {
+          if (!other.policyRuleIdList_.isEmpty()) {
+            if (policyRuleIdList_.isEmpty()) {
+              policyRuleIdList_ = other.policyRuleIdList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensurePolicyRuleIdListIsMutable();
+              policyRuleIdList_.addAll(other.policyRuleIdList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.policyRuleIdList_.isEmpty()) {
+            if (policyRuleIdListBuilder_.isEmpty()) {
+              policyRuleIdListBuilder_.dispose();
+              policyRuleIdListBuilder_ = null;
+              policyRuleIdList_ = other.policyRuleIdList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              policyRuleIdListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getPolicyRuleIdListFieldBuilder() : null;
+            } else {
+              policyRuleIdListBuilder_.addAllMessages(other.policyRuleIdList_);
+            }
+          }
         }
-        
-        booleanOperator_ = value.getNumber();
+        this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
       }
-      /**
-       * <pre>
-       * Evaluation operator to be used
-       * </pre>
-       *
-       * <code>.policy.BooleanOperator booleanOperator = 6;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearBooleanOperator() {
-        
-        booleanOperator_ = 0;
-        onChanged();
+
+      @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 {
+        policy.Policy.PolicyRuleIdList parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (policy.Policy.PolicyRuleIdList) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
         return this;
       }
+      private int bitField0_;
 
-      private java.util.List<policy.PolicyAction.PolicyRuleAction> actionList_ =
+      private java.util.List<policy.Policy.PolicyRuleId> policyRuleIdList_ =
         java.util.Collections.emptyList();
-      private void ensureActionListIsMutable() {
-        if (!((bitField0_ & 0x00000002) != 0)) {
-          actionList_ = new java.util.ArrayList<policy.PolicyAction.PolicyRuleAction>(actionList_);
-          bitField0_ |= 0x00000002;
+      private void ensurePolicyRuleIdListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          policyRuleIdList_ = new java.util.ArrayList<policy.Policy.PolicyRuleId>(policyRuleIdList_);
+          bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          policy.PolicyAction.PolicyRuleAction, policy.PolicyAction.PolicyRuleAction.Builder, policy.PolicyAction.PolicyRuleActionOrBuilder> actionListBuilder_;
+          policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder> policyRuleIdListBuilder_;
 
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public java.util.List<policy.PolicyAction.PolicyRuleAction> getActionListList() {
-        if (actionListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(actionList_);
+      public java.util.List<policy.Policy.PolicyRuleId> getPolicyRuleIdListList() {
+        if (policyRuleIdListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(policyRuleIdList_);
         } else {
-          return actionListBuilder_.getMessageList();
+          return policyRuleIdListBuilder_.getMessageList();
         }
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public int getActionListCount() {
-        if (actionListBuilder_ == null) {
-          return actionList_.size();
+      public int getPolicyRuleIdListCount() {
+        if (policyRuleIdListBuilder_ == null) {
+          return policyRuleIdList_.size();
         } else {
-          return actionListBuilder_.getCount();
+          return policyRuleIdListBuilder_.getCount();
         }
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public policy.PolicyAction.PolicyRuleAction getActionList(int index) {
-        if (actionListBuilder_ == null) {
-          return actionList_.get(index);
+      public policy.Policy.PolicyRuleId getPolicyRuleIdList(int index) {
+        if (policyRuleIdListBuilder_ == null) {
+          return policyRuleIdList_.get(index);
         } else {
-          return actionListBuilder_.getMessage(index);
+          return policyRuleIdListBuilder_.getMessage(index);
         }
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder setActionList(
-          int index, policy.PolicyAction.PolicyRuleAction value) {
-        if (actionListBuilder_ == null) {
+      public Builder setPolicyRuleIdList(
+          int index, policy.Policy.PolicyRuleId value) {
+        if (policyRuleIdListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureActionListIsMutable();
-          actionList_.set(index, value);
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.set(index, value);
           onChanged();
         } else {
-          actionListBuilder_.setMessage(index, value);
+          policyRuleIdListBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder setActionList(
-          int index, policy.PolicyAction.PolicyRuleAction.Builder builderForValue) {
-        if (actionListBuilder_ == null) {
-          ensureActionListIsMutable();
-          actionList_.set(index, builderForValue.build());
+      public Builder setPolicyRuleIdList(
+          int index, policy.Policy.PolicyRuleId.Builder builderForValue) {
+        if (policyRuleIdListBuilder_ == null) {
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.set(index, builderForValue.build());
           onChanged();
         } else {
-          actionListBuilder_.setMessage(index, builderForValue.build());
+          policyRuleIdListBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder addActionList(policy.PolicyAction.PolicyRuleAction value) {
-        if (actionListBuilder_ == null) {
+      public Builder addPolicyRuleIdList(policy.Policy.PolicyRuleId value) {
+        if (policyRuleIdListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureActionListIsMutable();
-          actionList_.add(value);
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.add(value);
           onChanged();
         } else {
-          actionListBuilder_.addMessage(value);
+          policyRuleIdListBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder addActionList(
-          int index, policy.PolicyAction.PolicyRuleAction value) {
-        if (actionListBuilder_ == null) {
+      public Builder addPolicyRuleIdList(
+          int index, policy.Policy.PolicyRuleId value) {
+        if (policyRuleIdListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureActionListIsMutable();
-          actionList_.add(index, value);
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.add(index, value);
           onChanged();
         } else {
-          actionListBuilder_.addMessage(index, value);
+          policyRuleIdListBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder addActionList(
-          policy.PolicyAction.PolicyRuleAction.Builder builderForValue) {
-        if (actionListBuilder_ == null) {
-          ensureActionListIsMutable();
-          actionList_.add(builderForValue.build());
+      public Builder addPolicyRuleIdList(
+          policy.Policy.PolicyRuleId.Builder builderForValue) {
+        if (policyRuleIdListBuilder_ == null) {
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.add(builderForValue.build());
           onChanged();
         } else {
-          actionListBuilder_.addMessage(builderForValue.build());
+          policyRuleIdListBuilder_.addMessage(builderForValue.build());
         }
         return this;
-      }
-      /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+      }
+      /**
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder addActionList(
-          int index, policy.PolicyAction.PolicyRuleAction.Builder builderForValue) {
-        if (actionListBuilder_ == null) {
-          ensureActionListIsMutable();
-          actionList_.add(index, builderForValue.build());
+      public Builder addPolicyRuleIdList(
+          int index, policy.Policy.PolicyRuleId.Builder builderForValue) {
+        if (policyRuleIdListBuilder_ == null) {
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.add(index, builderForValue.build());
           onChanged();
         } else {
-          actionListBuilder_.addMessage(index, builderForValue.build());
+          policyRuleIdListBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder addAllActionList(
-          java.lang.Iterable<? extends policy.PolicyAction.PolicyRuleAction> values) {
-        if (actionListBuilder_ == null) {
-          ensureActionListIsMutable();
+      public Builder addAllPolicyRuleIdList(
+          java.lang.Iterable<? extends policy.Policy.PolicyRuleId> values) {
+        if (policyRuleIdListBuilder_ == null) {
+          ensurePolicyRuleIdListIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, actionList_);
+              values, policyRuleIdList_);
           onChanged();
         } else {
-          actionListBuilder_.addAllMessages(values);
+          policyRuleIdListBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder clearActionList() {
-        if (actionListBuilder_ == null) {
-          actionList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
+      public Builder clearPolicyRuleIdList() {
+        if (policyRuleIdListBuilder_ == null) {
+          policyRuleIdList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          actionListBuilder_.clear();
+          policyRuleIdListBuilder_.clear();
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public Builder removeActionList(int index) {
-        if (actionListBuilder_ == null) {
-          ensureActionListIsMutable();
-          actionList_.remove(index);
+      public Builder removePolicyRuleIdList(int index) {
+        if (policyRuleIdListBuilder_ == null) {
+          ensurePolicyRuleIdListIsMutable();
+          policyRuleIdList_.remove(index);
           onChanged();
         } else {
-          actionListBuilder_.remove(index);
+          policyRuleIdListBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
        */
-      public policy.PolicyAction.PolicyRuleAction.Builder getActionListBuilder(
+      public policy.Policy.PolicyRuleId.Builder getPolicyRuleIdListBuilder(
           int index) {
-        return getActionListFieldBuilder().getBuilder(index);
+        return getPolicyRuleIdListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+       */
+      public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdListOrBuilder(
+          int index) {
+        if (policyRuleIdListBuilder_ == null) {
+          return policyRuleIdList_.get(index);  } else {
+          return policyRuleIdListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+       */
+      public java.util.List<? extends policy.Policy.PolicyRuleIdOrBuilder> 
+           getPolicyRuleIdListOrBuilderList() {
+        if (policyRuleIdListBuilder_ != null) {
+          return policyRuleIdListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(policyRuleIdList_);
+        }
+      }
+      /**
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+       */
+      public policy.Policy.PolicyRuleId.Builder addPolicyRuleIdListBuilder() {
+        return getPolicyRuleIdListFieldBuilder().addBuilder(
+            policy.Policy.PolicyRuleId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+       */
+      public policy.Policy.PolicyRuleId.Builder addPolicyRuleIdListBuilder(
+          int index) {
+        return getPolicyRuleIdListFieldBuilder().addBuilder(
+            index, policy.Policy.PolicyRuleId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .policy.PolicyRuleId policyRuleIdList = 1;</code>
+       */
+      public java.util.List<policy.Policy.PolicyRuleId.Builder> 
+           getPolicyRuleIdListBuilderList() {
+        return getPolicyRuleIdListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder> 
+          getPolicyRuleIdListFieldBuilder() {
+        if (policyRuleIdListBuilder_ == null) {
+          policyRuleIdListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleId.Builder, policy.Policy.PolicyRuleIdOrBuilder>(
+                  policyRuleIdList_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          policyRuleIdList_ = null;
+        }
+        return policyRuleIdListBuilder_;
+      }
+      @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:policy.PolicyRuleIdList)
+    }
+
+    // @@protoc_insertion_point(class_scope:policy.PolicyRuleIdList)
+    private static final policy.Policy.PolicyRuleIdList DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleIdList();
+    }
+
+    public static policy.Policy.PolicyRuleIdList getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<PolicyRuleIdList>
+        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleIdList>() {
+      @java.lang.Override
+      public PolicyRuleIdList parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new PolicyRuleIdList(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<PolicyRuleIdList> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<PolicyRuleIdList> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public policy.Policy.PolicyRuleIdList getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface PolicyRuleServiceListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleServiceList)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    java.util.List<policy.Policy.PolicyRuleService> 
+        getPolicyRuleServiceListList();
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    policy.Policy.PolicyRuleService getPolicyRuleServiceList(int index);
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    int getPolicyRuleServiceListCount();
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    java.util.List<? extends policy.Policy.PolicyRuleServiceOrBuilder> 
+        getPolicyRuleServiceListOrBuilderList();
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    policy.Policy.PolicyRuleServiceOrBuilder getPolicyRuleServiceListOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * A list of service-oriented policy rules
+   * </pre>
+   *
+   * Protobuf type {@code policy.PolicyRuleServiceList}
+   */
+  public static final class PolicyRuleServiceList extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
+      PolicyRuleServiceListOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use PolicyRuleServiceList.newBuilder() to construct.
+    private PolicyRuleServiceList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private PolicyRuleServiceList() {
+      policyRuleServiceList_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new PolicyRuleServiceList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private PolicyRuleServiceList(
+        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)) {
+                policyRuleServiceList_ = new java.util.ArrayList<policy.Policy.PolicyRuleService>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              policyRuleServiceList_.add(
+                  input.readMessage(policy.Policy.PolicyRuleService.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)) {
+          policyRuleServiceList_ = java.util.Collections.unmodifiableList(policyRuleServiceList_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return policy.Policy.internal_static_policy_PolicyRuleServiceList_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return policy.Policy.internal_static_policy_PolicyRuleServiceList_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              policy.Policy.PolicyRuleServiceList.class, policy.Policy.PolicyRuleServiceList.Builder.class);
+    }
+
+    public static final int POLICYRULESERVICELIST_FIELD_NUMBER = 1;
+    private java.util.List<policy.Policy.PolicyRuleService> policyRuleServiceList_;
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<policy.Policy.PolicyRuleService> getPolicyRuleServiceListList() {
+      return policyRuleServiceList_;
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends policy.Policy.PolicyRuleServiceOrBuilder> 
+        getPolicyRuleServiceListOrBuilderList() {
+      return policyRuleServiceList_;
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    @java.lang.Override
+    public int getPolicyRuleServiceListCount() {
+      return policyRuleServiceList_.size();
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleService getPolicyRuleServiceList(int index) {
+      return policyRuleServiceList_.get(index);
+    }
+    /**
+     * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
+     */
+    @java.lang.Override
+    public policy.Policy.PolicyRuleServiceOrBuilder getPolicyRuleServiceListOrBuilder(
+        int index) {
+      return policyRuleServiceList_.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 < policyRuleServiceList_.size(); i++) {
+        output.writeMessage(1, policyRuleServiceList_.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 < policyRuleServiceList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, policyRuleServiceList_.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;
       }
-      /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-       */
-      public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(
-          int index) {
-        if (actionListBuilder_ == null) {
-          return actionList_.get(index);  } else {
-          return actionListBuilder_.getMessageOrBuilder(index);
-        }
+      if (!(obj instanceof policy.Policy.PolicyRuleServiceList)) {
+        return super.equals(obj);
       }
-      /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-       */
-      public java.util.List<? extends policy.PolicyAction.PolicyRuleActionOrBuilder> 
-           getActionListOrBuilderList() {
-        if (actionListBuilder_ != null) {
-          return actionListBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(actionList_);
-        }
+      policy.Policy.PolicyRuleServiceList other = (policy.Policy.PolicyRuleServiceList) obj;
+
+      if (!getPolicyRuleServiceListList()
+          .equals(other.getPolicyRuleServiceListList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
       }
-      /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-       */
-      public policy.PolicyAction.PolicyRuleAction.Builder addActionListBuilder() {
-        return getActionListFieldBuilder().addBuilder(
-            policy.PolicyAction.PolicyRuleAction.getDefaultInstance());
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getPolicyRuleServiceListCount() > 0) {
+        hash = (37 * hash) + POLICYRULESERVICELIST_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleServiceListList().hashCode();
       }
-      /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-       */
-      public policy.PolicyAction.PolicyRuleAction.Builder addActionListBuilder(
-          int index) {
-        return getActionListFieldBuilder().addBuilder(
-            index, policy.PolicyAction.PolicyRuleAction.getDefaultInstance());
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static policy.Policy.PolicyRuleServiceList parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleServiceList parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleServiceList parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleServiceList parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleServiceList parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static policy.Policy.PolicyRuleServiceList parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static policy.Policy.PolicyRuleServiceList parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleServiceList 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 policy.Policy.PolicyRuleServiceList parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleServiceList 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 policy.Policy.PolicyRuleServiceList parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static policy.Policy.PolicyRuleServiceList 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(policy.Policy.PolicyRuleServiceList 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>
+     * A list of service-oriented policy rules
+     * </pre>
+     *
+     * Protobuf type {@code policy.PolicyRuleServiceList}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
+        policy.Policy.PolicyRuleServiceListOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return policy.Policy.internal_static_policy_PolicyRuleServiceList_descriptor;
       }
-      /**
-       * <pre>
-       * One or more actions should be applied
-       * </pre>
-       *
-       * <code>repeated .policy.PolicyRuleAction actionList = 7;</code>
-       */
-      public java.util.List<policy.PolicyAction.PolicyRuleAction.Builder> 
-           getActionListBuilderList() {
-        return getActionListFieldBuilder().getBuilderList();
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return policy.Policy.internal_static_policy_PolicyRuleServiceList_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                policy.Policy.PolicyRuleServiceList.class, policy.Policy.PolicyRuleServiceList.Builder.class);
       }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          policy.PolicyAction.PolicyRuleAction, policy.PolicyAction.PolicyRuleAction.Builder, policy.PolicyAction.PolicyRuleActionOrBuilder> 
-          getActionListFieldBuilder() {
-        if (actionListBuilder_ == null) {
-          actionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              policy.PolicyAction.PolicyRuleAction, policy.PolicyAction.PolicyRuleAction.Builder, policy.PolicyAction.PolicyRuleActionOrBuilder>(
-                  actionList_,
-                  ((bitField0_ & 0x00000002) != 0),
-                  getParentForChildren(),
-                  isClean());
-          actionList_ = null;
-        }
-        return actionListBuilder_;
+
+      // Construct using policy.Policy.PolicyRuleServiceList.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
       }
 
-      private context.ContextOuterClass.ServiceId serviceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       * @return Whether the serviceId field is set.
-       */
-      public boolean hasServiceId() {
-        return serviceIdBuilder_ != null || serviceId_ != null;
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       * @return The serviceId.
-       */
-      public context.ContextOuterClass.ServiceId getServiceId() {
-        if (serviceIdBuilder_ == null) {
-          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
-        } else {
-          return serviceIdBuilder_.getMessage();
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getPolicyRuleServiceListFieldBuilder();
         }
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          serviceId_ = value;
-          onChanged();
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (policyRuleServiceListBuilder_ == null) {
+          policyRuleServiceList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          serviceIdBuilder_.setMessage(value);
+          policyRuleServiceListBuilder_.clear();
         }
-
         return this;
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      public Builder setServiceId(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = builderForValue.build();
-          onChanged();
-        } else {
-          serviceIdBuilder_.setMessage(builderForValue.build());
-        }
 
-        return this;
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return policy.Policy.internal_static_policy_PolicyRuleServiceList_descriptor;
+      }
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleServiceList getDefaultInstanceForType() {
+        return policy.Policy.PolicyRuleServiceList.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleServiceList build() {
+        policy.Policy.PolicyRuleServiceList result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (serviceId_ != null) {
-            serviceId_ =
-              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
-          } else {
-            serviceId_ = value;
+
+      @java.lang.Override
+      public policy.Policy.PolicyRuleServiceList buildPartial() {
+        policy.Policy.PolicyRuleServiceList result = new policy.Policy.PolicyRuleServiceList(this);
+        int from_bitField0_ = bitField0_;
+        if (policyRuleServiceListBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            policyRuleServiceList_ = java.util.Collections.unmodifiableList(policyRuleServiceList_);
+            bitField0_ = (bitField0_ & ~0x00000001);
           }
-          onChanged();
+          result.policyRuleServiceList_ = policyRuleServiceList_;
         } else {
-          serviceIdBuilder_.mergeFrom(value);
+          result.policyRuleServiceList_ = policyRuleServiceListBuilder_.build();
         }
+        onBuilt();
+        return result;
+      }
 
-        return this;
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      public Builder clearServiceId() {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
-          onChanged();
+      @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 policy.Policy.PolicyRuleServiceList) {
+          return mergeFrom((policy.Policy.PolicyRuleServiceList)other);
         } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
+          super.mergeFrom(other);
+          return this;
         }
-
-        return this;
-      }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-        
-        onChanged();
-        return getServiceIdFieldBuilder().getBuilder();
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-        if (serviceIdBuilder_ != null) {
-          return serviceIdBuilder_.getMessageOrBuilder();
+
+      public Builder mergeFrom(policy.Policy.PolicyRuleServiceList other) {
+        if (other == policy.Policy.PolicyRuleServiceList.getDefaultInstance()) return this;
+        if (policyRuleServiceListBuilder_ == null) {
+          if (!other.policyRuleServiceList_.isEmpty()) {
+            if (policyRuleServiceList_.isEmpty()) {
+              policyRuleServiceList_ = other.policyRuleServiceList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensurePolicyRuleServiceListIsMutable();
+              policyRuleServiceList_.addAll(other.policyRuleServiceList_);
+            }
+            onChanged();
+          }
         } else {
-          return serviceId_ == null ?
-              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+          if (!other.policyRuleServiceList_.isEmpty()) {
+            if (policyRuleServiceListBuilder_.isEmpty()) {
+              policyRuleServiceListBuilder_.dispose();
+              policyRuleServiceListBuilder_ = null;
+              policyRuleServiceList_ = other.policyRuleServiceList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              policyRuleServiceListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getPolicyRuleServiceListFieldBuilder() : null;
+            } else {
+              policyRuleServiceListBuilder_.addAllMessages(other.policyRuleServiceList_);
+            }
+          }
         }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
       }
-      /**
-       * <pre>
-       * Affected service and devices
-       * </pre>
-       *
-       * <code>.context.ServiceId serviceId = 8;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getServiceIdFieldBuilder() {
-        if (serviceIdBuilder_ == null) {
-          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  getServiceId(),
-                  getParentForChildren(),
-                  isClean());
-          serviceId_ = null;
+
+      @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 {
+        policy.Policy.PolicyRuleServiceList parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (policy.Policy.PolicyRuleServiceList) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
         }
-        return serviceIdBuilder_;
+        return this;
       }
+      private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.DeviceId> deviceList_ =
+      private java.util.List<policy.Policy.PolicyRuleService> policyRuleServiceList_ =
         java.util.Collections.emptyList();
-      private void ensureDeviceListIsMutable() {
-        if (!((bitField0_ & 0x00000004) != 0)) {
-          deviceList_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>(deviceList_);
-          bitField0_ |= 0x00000004;
+      private void ensurePolicyRuleServiceListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          policyRuleServiceList_ = new java.util.ArrayList<policy.Policy.PolicyRuleService>(policyRuleServiceList_);
+          bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceListBuilder_;
+          policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleService.Builder, policy.Policy.PolicyRuleServiceOrBuilder> policyRuleServiceListBuilder_;
 
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.DeviceId> getDeviceListList() {
-        if (deviceListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(deviceList_);
+      public java.util.List<policy.Policy.PolicyRuleService> getPolicyRuleServiceListList() {
+        if (policyRuleServiceListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(policyRuleServiceList_);
         } else {
-          return deviceListBuilder_.getMessageList();
+          return policyRuleServiceListBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public int getDeviceListCount() {
-        if (deviceListBuilder_ == null) {
-          return deviceList_.size();
+      public int getPolicyRuleServiceListCount() {
+        if (policyRuleServiceListBuilder_ == null) {
+          return policyRuleServiceList_.size();
         } else {
-          return deviceListBuilder_.getCount();
+          return policyRuleServiceListBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public context.ContextOuterClass.DeviceId getDeviceList(int index) {
-        if (deviceListBuilder_ == null) {
-          return deviceList_.get(index);
+      public policy.Policy.PolicyRuleService getPolicyRuleServiceList(int index) {
+        if (policyRuleServiceListBuilder_ == null) {
+          return policyRuleServiceList_.get(index);
         } else {
-          return deviceListBuilder_.getMessage(index);
+          return policyRuleServiceListBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder setDeviceList(
-          int index, context.ContextOuterClass.DeviceId value) {
-        if (deviceListBuilder_ == null) {
+      public Builder setPolicyRuleServiceList(
+          int index, policy.Policy.PolicyRuleService value) {
+        if (policyRuleServiceListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureDeviceListIsMutable();
-          deviceList_.set(index, value);
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.set(index, value);
           onChanged();
         } else {
-          deviceListBuilder_.setMessage(index, value);
+          policyRuleServiceListBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder setDeviceList(
-          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
-        if (deviceListBuilder_ == null) {
-          ensureDeviceListIsMutable();
-          deviceList_.set(index, builderForValue.build());
+      public Builder setPolicyRuleServiceList(
+          int index, policy.Policy.PolicyRuleService.Builder builderForValue) {
+        if (policyRuleServiceListBuilder_ == null) {
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.set(index, builderForValue.build());
           onChanged();
         } else {
-          deviceListBuilder_.setMessage(index, builderForValue.build());
+          policyRuleServiceListBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder addDeviceList(context.ContextOuterClass.DeviceId value) {
-        if (deviceListBuilder_ == null) {
+      public Builder addPolicyRuleServiceList(policy.Policy.PolicyRuleService value) {
+        if (policyRuleServiceListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureDeviceListIsMutable();
-          deviceList_.add(value);
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.add(value);
           onChanged();
         } else {
-          deviceListBuilder_.addMessage(value);
+          policyRuleServiceListBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder addDeviceList(
-          int index, context.ContextOuterClass.DeviceId value) {
-        if (deviceListBuilder_ == null) {
+      public Builder addPolicyRuleServiceList(
+          int index, policy.Policy.PolicyRuleService value) {
+        if (policyRuleServiceListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureDeviceListIsMutable();
-          deviceList_.add(index, value);
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.add(index, value);
           onChanged();
         } else {
-          deviceListBuilder_.addMessage(index, value);
+          policyRuleServiceListBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder addDeviceList(
-          context.ContextOuterClass.DeviceId.Builder builderForValue) {
-        if (deviceListBuilder_ == null) {
-          ensureDeviceListIsMutable();
-          deviceList_.add(builderForValue.build());
+      public Builder addPolicyRuleServiceList(
+          policy.Policy.PolicyRuleService.Builder builderForValue) {
+        if (policyRuleServiceListBuilder_ == null) {
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.add(builderForValue.build());
           onChanged();
         } else {
-          deviceListBuilder_.addMessage(builderForValue.build());
+          policyRuleServiceListBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder addDeviceList(
-          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
-        if (deviceListBuilder_ == null) {
-          ensureDeviceListIsMutable();
-          deviceList_.add(index, builderForValue.build());
+      public Builder addPolicyRuleServiceList(
+          int index, policy.Policy.PolicyRuleService.Builder builderForValue) {
+        if (policyRuleServiceListBuilder_ == null) {
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.add(index, builderForValue.build());
           onChanged();
         } else {
-          deviceListBuilder_.addMessage(index, builderForValue.build());
+          policyRuleServiceListBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder addAllDeviceList(
-          java.lang.Iterable<? extends context.ContextOuterClass.DeviceId> values) {
-        if (deviceListBuilder_ == null) {
-          ensureDeviceListIsMutable();
+      public Builder addAllPolicyRuleServiceList(
+          java.lang.Iterable<? extends policy.Policy.PolicyRuleService> values) {
+        if (policyRuleServiceListBuilder_ == null) {
+          ensurePolicyRuleServiceListIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, deviceList_);
+              values, policyRuleServiceList_);
           onChanged();
         } else {
-          deviceListBuilder_.addAllMessages(values);
+          policyRuleServiceListBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder clearDeviceList() {
-        if (deviceListBuilder_ == null) {
-          deviceList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000004);
+      public Builder clearPolicyRuleServiceList() {
+        if (policyRuleServiceListBuilder_ == null) {
+          policyRuleServiceList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          deviceListBuilder_.clear();
+          policyRuleServiceListBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public Builder removeDeviceList(int index) {
-        if (deviceListBuilder_ == null) {
-          ensureDeviceListIsMutable();
-          deviceList_.remove(index);
+      public Builder removePolicyRuleServiceList(int index) {
+        if (policyRuleServiceListBuilder_ == null) {
+          ensurePolicyRuleServiceListIsMutable();
+          policyRuleServiceList_.remove(index);
           onChanged();
         } else {
-          deviceListBuilder_.remove(index);
+          policyRuleServiceListBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public context.ContextOuterClass.DeviceId.Builder getDeviceListBuilder(
+      public policy.Policy.PolicyRuleService.Builder getPolicyRuleServiceListBuilder(
           int index) {
-        return getDeviceListFieldBuilder().getBuilder(index);
+        return getPolicyRuleServiceListFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceListOrBuilder(
+      public policy.Policy.PolicyRuleServiceOrBuilder getPolicyRuleServiceListOrBuilder(
           int index) {
-        if (deviceListBuilder_ == null) {
-          return deviceList_.get(index);  } else {
-          return deviceListBuilder_.getMessageOrBuilder(index);
+        if (policyRuleServiceListBuilder_ == null) {
+          return policyRuleServiceList_.get(index);  } else {
+          return policyRuleServiceListBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
-           getDeviceListOrBuilderList() {
-        if (deviceListBuilder_ != null) {
-          return deviceListBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends policy.Policy.PolicyRuleServiceOrBuilder> 
+           getPolicyRuleServiceListOrBuilderList() {
+        if (policyRuleServiceListBuilder_ != null) {
+          return policyRuleServiceListBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(deviceList_);
+          return java.util.Collections.unmodifiableList(policyRuleServiceList_);
         }
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public context.ContextOuterClass.DeviceId.Builder addDeviceListBuilder() {
-        return getDeviceListFieldBuilder().addBuilder(
-            context.ContextOuterClass.DeviceId.getDefaultInstance());
+      public policy.Policy.PolicyRuleService.Builder addPolicyRuleServiceListBuilder() {
+        return getPolicyRuleServiceListFieldBuilder().addBuilder(
+            policy.Policy.PolicyRuleService.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public context.ContextOuterClass.DeviceId.Builder addDeviceListBuilder(
+      public policy.Policy.PolicyRuleService.Builder addPolicyRuleServiceListBuilder(
           int index) {
-        return getDeviceListFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.DeviceId.getDefaultInstance());
+        return getPolicyRuleServiceListFieldBuilder().addBuilder(
+            index, policy.Policy.PolicyRuleService.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.DeviceId deviceList = 9;</code>
+       * <code>repeated .policy.PolicyRuleService policyRuleServiceList = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.DeviceId.Builder> 
-           getDeviceListBuilderList() {
-        return getDeviceListFieldBuilder().getBuilderList();
+      public java.util.List<policy.Policy.PolicyRuleService.Builder> 
+           getPolicyRuleServiceListBuilderList() {
+        return getPolicyRuleServiceListFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
-          getDeviceListFieldBuilder() {
-        if (deviceListBuilder_ == null) {
-          deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
-                  deviceList_,
-                  ((bitField0_ & 0x00000004) != 0),
+          policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleService.Builder, policy.Policy.PolicyRuleServiceOrBuilder> 
+          getPolicyRuleServiceListFieldBuilder() {
+        if (policyRuleServiceListBuilder_ == null) {
+          policyRuleServiceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleService.Builder, policy.Policy.PolicyRuleServiceOrBuilder>(
+                  policyRuleServiceList_,
+                  ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          deviceList_ = null;
+          policyRuleServiceList_ = null;
         }
-        return deviceListBuilder_;
+        return policyRuleServiceListBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -5105,99 +7638,99 @@ public final class Policy {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:policy.PolicyRule)
+      // @@protoc_insertion_point(builder_scope:policy.PolicyRuleServiceList)
     }
 
-    // @@protoc_insertion_point(class_scope:policy.PolicyRule)
-    private static final policy.Policy.PolicyRule DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:policy.PolicyRuleServiceList)
+    private static final policy.Policy.PolicyRuleServiceList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new policy.Policy.PolicyRule();
+      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleServiceList();
     }
 
-    public static policy.Policy.PolicyRule getDefaultInstance() {
+    public static policy.Policy.PolicyRuleServiceList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<PolicyRule>
-        PARSER = new com.google.protobuf.AbstractParser<PolicyRule>() {
+    private static final com.google.protobuf.Parser<PolicyRuleServiceList>
+        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleServiceList>() {
       @java.lang.Override
-      public PolicyRule parsePartialFrom(
+      public PolicyRuleServiceList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new PolicyRule(input, extensionRegistry);
+        return new PolicyRuleServiceList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<PolicyRule> parser() {
+    public static com.google.protobuf.Parser<PolicyRuleServiceList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<PolicyRule> getParserForType() {
+    public com.google.protobuf.Parser<PolicyRuleServiceList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public policy.Policy.PolicyRule getDefaultInstanceForType() {
+    public policy.Policy.PolicyRuleServiceList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface PolicyRuleListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleList)
+  public interface PolicyRuleDeviceListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDeviceList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
-    java.util.List<policy.Policy.PolicyRule> 
-        getPolicyRuleListList();
+    java.util.List<policy.Policy.PolicyRuleDevice> 
+        getPolicyRuleDeviceListList();
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
-    policy.Policy.PolicyRule getPolicyRuleList(int index);
+    policy.Policy.PolicyRuleDevice getPolicyRuleDeviceList(int index);
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
-    int getPolicyRuleListCount();
+    int getPolicyRuleDeviceListCount();
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
-    java.util.List<? extends policy.Policy.PolicyRuleOrBuilder> 
-        getPolicyRuleListOrBuilderList();
+    java.util.List<? extends policy.Policy.PolicyRuleDeviceOrBuilder> 
+        getPolicyRuleDeviceListOrBuilderList();
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
-    policy.Policy.PolicyRuleOrBuilder getPolicyRuleListOrBuilder(
+    policy.Policy.PolicyRuleDeviceOrBuilder getPolicyRuleDeviceListOrBuilder(
         int index);
   }
   /**
    * <pre>
-   * A list of policy rules
+   * A list of device-oriented policy rules
    * </pre>
    *
-   * Protobuf type {@code policy.PolicyRuleList}
+   * Protobuf type {@code policy.PolicyRuleDeviceList}
    */
-  public static final class PolicyRuleList extends
+  public static final class PolicyRuleDeviceList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
-      PolicyRuleListOrBuilder {
+      // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
+      PolicyRuleDeviceListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use PolicyRuleList.newBuilder() to construct.
-    private PolicyRuleList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use PolicyRuleDeviceList.newBuilder() to construct.
+    private PolicyRuleDeviceList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private PolicyRuleList() {
-      policyRuleList_ = java.util.Collections.emptyList();
+    private PolicyRuleDeviceList() {
+      policyRuleDeviceList_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new PolicyRuleList();
+      return new PolicyRuleDeviceList();
     }
 
     @java.lang.Override
@@ -5205,7 +7738,7 @@ public final class Policy {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private PolicyRuleList(
+    private PolicyRuleDeviceList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -5226,11 +7759,11 @@ public final class Policy {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                policyRuleList_ = new java.util.ArrayList<policy.Policy.PolicyRule>();
+                policyRuleDeviceList_ = new java.util.ArrayList<policy.Policy.PolicyRuleDevice>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              policyRuleList_.add(
-                  input.readMessage(policy.Policy.PolicyRule.parser(), extensionRegistry));
+              policyRuleDeviceList_.add(
+                  input.readMessage(policy.Policy.PolicyRuleDevice.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -5249,7 +7782,7 @@ public final class Policy {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          policyRuleList_ = java.util.Collections.unmodifiableList(policyRuleList_);
+          policyRuleDeviceList_ = java.util.Collections.unmodifiableList(policyRuleDeviceList_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -5257,55 +7790,55 @@ public final class Policy {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return policy.Policy.internal_static_policy_PolicyRuleList_descriptor;
+      return policy.Policy.internal_static_policy_PolicyRuleDeviceList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return policy.Policy.internal_static_policy_PolicyRuleList_fieldAccessorTable
+      return policy.Policy.internal_static_policy_PolicyRuleDeviceList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              policy.Policy.PolicyRuleList.class, policy.Policy.PolicyRuleList.Builder.class);
+              policy.Policy.PolicyRuleDeviceList.class, policy.Policy.PolicyRuleDeviceList.Builder.class);
     }
 
-    public static final int POLICYRULELIST_FIELD_NUMBER = 1;
-    private java.util.List<policy.Policy.PolicyRule> policyRuleList_;
+    public static final int POLICYRULEDEVICELIST_FIELD_NUMBER = 1;
+    private java.util.List<policy.Policy.PolicyRuleDevice> policyRuleDeviceList_;
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<policy.Policy.PolicyRule> getPolicyRuleListList() {
-      return policyRuleList_;
+    public java.util.List<policy.Policy.PolicyRuleDevice> getPolicyRuleDeviceListList() {
+      return policyRuleDeviceList_;
     }
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends policy.Policy.PolicyRuleOrBuilder> 
-        getPolicyRuleListOrBuilderList() {
-      return policyRuleList_;
+    public java.util.List<? extends policy.Policy.PolicyRuleDeviceOrBuilder> 
+        getPolicyRuleDeviceListOrBuilderList() {
+      return policyRuleDeviceList_;
     }
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
     @java.lang.Override
-    public int getPolicyRuleListCount() {
-      return policyRuleList_.size();
+    public int getPolicyRuleDeviceListCount() {
+      return policyRuleDeviceList_.size();
     }
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
     @java.lang.Override
-    public policy.Policy.PolicyRule getPolicyRuleList(int index) {
-      return policyRuleList_.get(index);
+    public policy.Policy.PolicyRuleDevice getPolicyRuleDeviceList(int index) {
+      return policyRuleDeviceList_.get(index);
     }
     /**
-     * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+     * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
      */
     @java.lang.Override
-    public policy.Policy.PolicyRuleOrBuilder getPolicyRuleListOrBuilder(
+    public policy.Policy.PolicyRuleDeviceOrBuilder getPolicyRuleDeviceListOrBuilder(
         int index) {
-      return policyRuleList_.get(index);
+      return policyRuleDeviceList_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -5322,8 +7855,8 @@ public final class Policy {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < policyRuleList_.size(); i++) {
-        output.writeMessage(1, policyRuleList_.get(i));
+      for (int i = 0; i < policyRuleDeviceList_.size(); i++) {
+        output.writeMessage(1, policyRuleDeviceList_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -5334,9 +7867,9 @@ public final class Policy {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < policyRuleList_.size(); i++) {
+      for (int i = 0; i < policyRuleDeviceList_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, policyRuleList_.get(i));
+          .computeMessageSize(1, policyRuleDeviceList_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -5348,13 +7881,13 @@ public final class Policy {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof policy.Policy.PolicyRuleList)) {
+      if (!(obj instanceof policy.Policy.PolicyRuleDeviceList)) {
         return super.equals(obj);
       }
-      policy.Policy.PolicyRuleList other = (policy.Policy.PolicyRuleList) obj;
+      policy.Policy.PolicyRuleDeviceList other = (policy.Policy.PolicyRuleDeviceList) obj;
 
-      if (!getPolicyRuleListList()
-          .equals(other.getPolicyRuleListList())) return false;
+      if (!getPolicyRuleDeviceListList()
+          .equals(other.getPolicyRuleDeviceListList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -5366,78 +7899,78 @@ public final class Policy {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getPolicyRuleListCount() > 0) {
-        hash = (37 * hash) + POLICYRULELIST_FIELD_NUMBER;
-        hash = (53 * hash) + getPolicyRuleListList().hashCode();
+      if (getPolicyRuleDeviceListCount() > 0) {
+        hash = (37 * hash) + POLICYRULEDEVICELIST_FIELD_NUMBER;
+        hash = (53 * hash) + getPolicyRuleDeviceListList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(byte[] data)
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(java.io.InputStream input)
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList 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 policy.Policy.PolicyRuleList parseDelimitedFrom(java.io.InputStream input)
+    public static policy.Policy.PolicyRuleDeviceList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRuleList parseDelimitedFrom(
+    public static policy.Policy.PolicyRuleDeviceList 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 policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static policy.Policy.PolicyRuleList parseFrom(
+    public static policy.Policy.PolicyRuleDeviceList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -5450,7 +7983,7 @@ public final class Policy {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(policy.Policy.PolicyRuleList prototype) {
+    public static Builder newBuilder(policy.Policy.PolicyRuleDeviceList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -5467,29 +8000,29 @@ public final class Policy {
     }
     /**
      * <pre>
-     * A list of policy rules
+     * A list of device-oriented policy rules
      * </pre>
      *
-     * Protobuf type {@code policy.PolicyRuleList}
+     * Protobuf type {@code policy.PolicyRuleDeviceList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
-        policy.Policy.PolicyRuleListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
+        policy.Policy.PolicyRuleDeviceListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return policy.Policy.internal_static_policy_PolicyRuleList_descriptor;
+        return policy.Policy.internal_static_policy_PolicyRuleDeviceList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return policy.Policy.internal_static_policy_PolicyRuleList_fieldAccessorTable
+        return policy.Policy.internal_static_policy_PolicyRuleDeviceList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                policy.Policy.PolicyRuleList.class, policy.Policy.PolicyRuleList.Builder.class);
+                policy.Policy.PolicyRuleDeviceList.class, policy.Policy.PolicyRuleDeviceList.Builder.class);
       }
 
-      // Construct using policy.Policy.PolicyRuleList.newBuilder()
+      // Construct using policy.Policy.PolicyRuleDeviceList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -5502,17 +8035,17 @@ public final class Policy {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getPolicyRuleListFieldBuilder();
+          getPolicyRuleDeviceListFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (policyRuleListBuilder_ == null) {
-          policyRuleList_ = java.util.Collections.emptyList();
+        if (policyRuleDeviceListBuilder_ == null) {
+          policyRuleDeviceList_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          policyRuleListBuilder_.clear();
+          policyRuleDeviceListBuilder_.clear();
         }
         return this;
       }
@@ -5520,17 +8053,17 @@ public final class Policy {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return policy.Policy.internal_static_policy_PolicyRuleList_descriptor;
+        return policy.Policy.internal_static_policy_PolicyRuleDeviceList_descriptor;
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRuleList getDefaultInstanceForType() {
-        return policy.Policy.PolicyRuleList.getDefaultInstance();
+      public policy.Policy.PolicyRuleDeviceList getDefaultInstanceForType() {
+        return policy.Policy.PolicyRuleDeviceList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRuleList build() {
-        policy.Policy.PolicyRuleList result = buildPartial();
+      public policy.Policy.PolicyRuleDeviceList build() {
+        policy.Policy.PolicyRuleDeviceList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -5538,17 +8071,17 @@ public final class Policy {
       }
 
       @java.lang.Override
-      public policy.Policy.PolicyRuleList buildPartial() {
-        policy.Policy.PolicyRuleList result = new policy.Policy.PolicyRuleList(this);
+      public policy.Policy.PolicyRuleDeviceList buildPartial() {
+        policy.Policy.PolicyRuleDeviceList result = new policy.Policy.PolicyRuleDeviceList(this);
         int from_bitField0_ = bitField0_;
-        if (policyRuleListBuilder_ == null) {
+        if (policyRuleDeviceListBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            policyRuleList_ = java.util.Collections.unmodifiableList(policyRuleList_);
+            policyRuleDeviceList_ = java.util.Collections.unmodifiableList(policyRuleDeviceList_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.policyRuleList_ = policyRuleList_;
+          result.policyRuleDeviceList_ = policyRuleDeviceList_;
         } else {
-          result.policyRuleList_ = policyRuleListBuilder_.build();
+          result.policyRuleDeviceList_ = policyRuleDeviceListBuilder_.build();
         }
         onBuilt();
         return result;
@@ -5588,39 +8121,39 @@ public final class Policy {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof policy.Policy.PolicyRuleList) {
-          return mergeFrom((policy.Policy.PolicyRuleList)other);
+        if (other instanceof policy.Policy.PolicyRuleDeviceList) {
+          return mergeFrom((policy.Policy.PolicyRuleDeviceList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(policy.Policy.PolicyRuleList other) {
-        if (other == policy.Policy.PolicyRuleList.getDefaultInstance()) return this;
-        if (policyRuleListBuilder_ == null) {
-          if (!other.policyRuleList_.isEmpty()) {
-            if (policyRuleList_.isEmpty()) {
-              policyRuleList_ = other.policyRuleList_;
+      public Builder mergeFrom(policy.Policy.PolicyRuleDeviceList other) {
+        if (other == policy.Policy.PolicyRuleDeviceList.getDefaultInstance()) return this;
+        if (policyRuleDeviceListBuilder_ == null) {
+          if (!other.policyRuleDeviceList_.isEmpty()) {
+            if (policyRuleDeviceList_.isEmpty()) {
+              policyRuleDeviceList_ = other.policyRuleDeviceList_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensurePolicyRuleListIsMutable();
-              policyRuleList_.addAll(other.policyRuleList_);
+              ensurePolicyRuleDeviceListIsMutable();
+              policyRuleDeviceList_.addAll(other.policyRuleDeviceList_);
             }
             onChanged();
           }
         } else {
-          if (!other.policyRuleList_.isEmpty()) {
-            if (policyRuleListBuilder_.isEmpty()) {
-              policyRuleListBuilder_.dispose();
-              policyRuleListBuilder_ = null;
-              policyRuleList_ = other.policyRuleList_;
+          if (!other.policyRuleDeviceList_.isEmpty()) {
+            if (policyRuleDeviceListBuilder_.isEmpty()) {
+              policyRuleDeviceListBuilder_.dispose();
+              policyRuleDeviceListBuilder_ = null;
+              policyRuleDeviceList_ = other.policyRuleDeviceList_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              policyRuleListBuilder_ = 
+              policyRuleDeviceListBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getPolicyRuleListFieldBuilder() : null;
+                   getPolicyRuleDeviceListFieldBuilder() : null;
             } else {
-              policyRuleListBuilder_.addAllMessages(other.policyRuleList_);
+              policyRuleDeviceListBuilder_.addAllMessages(other.policyRuleDeviceList_);
             }
           }
         }
@@ -5639,11 +8172,11 @@ public final class Policy {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        policy.Policy.PolicyRuleList parsedMessage = null;
+        policy.Policy.PolicyRuleDeviceList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (policy.Policy.PolicyRuleList) e.getUnfinishedMessage();
+          parsedMessage = (policy.Policy.PolicyRuleDeviceList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -5654,244 +8187,244 @@ public final class Policy {
       }
       private int bitField0_;
 
-      private java.util.List<policy.Policy.PolicyRule> policyRuleList_ =
+      private java.util.List<policy.Policy.PolicyRuleDevice> policyRuleDeviceList_ =
         java.util.Collections.emptyList();
-      private void ensurePolicyRuleListIsMutable() {
+      private void ensurePolicyRuleDeviceListIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          policyRuleList_ = new java.util.ArrayList<policy.Policy.PolicyRule>(policyRuleList_);
+          policyRuleDeviceList_ = new java.util.ArrayList<policy.Policy.PolicyRuleDevice>(policyRuleDeviceList_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          policy.Policy.PolicyRule, policy.Policy.PolicyRule.Builder, policy.Policy.PolicyRuleOrBuilder> policyRuleListBuilder_;
+          policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleDevice.Builder, policy.Policy.PolicyRuleDeviceOrBuilder> policyRuleDeviceListBuilder_;
 
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public java.util.List<policy.Policy.PolicyRule> getPolicyRuleListList() {
-        if (policyRuleListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(policyRuleList_);
+      public java.util.List<policy.Policy.PolicyRuleDevice> getPolicyRuleDeviceListList() {
+        if (policyRuleDeviceListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(policyRuleDeviceList_);
         } else {
-          return policyRuleListBuilder_.getMessageList();
+          return policyRuleDeviceListBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public int getPolicyRuleListCount() {
-        if (policyRuleListBuilder_ == null) {
-          return policyRuleList_.size();
+      public int getPolicyRuleDeviceListCount() {
+        if (policyRuleDeviceListBuilder_ == null) {
+          return policyRuleDeviceList_.size();
         } else {
-          return policyRuleListBuilder_.getCount();
+          return policyRuleDeviceListBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public policy.Policy.PolicyRule getPolicyRuleList(int index) {
-        if (policyRuleListBuilder_ == null) {
-          return policyRuleList_.get(index);
+      public policy.Policy.PolicyRuleDevice getPolicyRuleDeviceList(int index) {
+        if (policyRuleDeviceListBuilder_ == null) {
+          return policyRuleDeviceList_.get(index);
         } else {
-          return policyRuleListBuilder_.getMessage(index);
+          return policyRuleDeviceListBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder setPolicyRuleList(
-          int index, policy.Policy.PolicyRule value) {
-        if (policyRuleListBuilder_ == null) {
+      public Builder setPolicyRuleDeviceList(
+          int index, policy.Policy.PolicyRuleDevice value) {
+        if (policyRuleDeviceListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.set(index, value);
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.set(index, value);
           onChanged();
         } else {
-          policyRuleListBuilder_.setMessage(index, value);
+          policyRuleDeviceListBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder setPolicyRuleList(
-          int index, policy.Policy.PolicyRule.Builder builderForValue) {
-        if (policyRuleListBuilder_ == null) {
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.set(index, builderForValue.build());
+      public Builder setPolicyRuleDeviceList(
+          int index, policy.Policy.PolicyRuleDevice.Builder builderForValue) {
+        if (policyRuleDeviceListBuilder_ == null) {
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.set(index, builderForValue.build());
           onChanged();
         } else {
-          policyRuleListBuilder_.setMessage(index, builderForValue.build());
+          policyRuleDeviceListBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder addPolicyRuleList(policy.Policy.PolicyRule value) {
-        if (policyRuleListBuilder_ == null) {
+      public Builder addPolicyRuleDeviceList(policy.Policy.PolicyRuleDevice value) {
+        if (policyRuleDeviceListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.add(value);
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.add(value);
           onChanged();
         } else {
-          policyRuleListBuilder_.addMessage(value);
+          policyRuleDeviceListBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder addPolicyRuleList(
-          int index, policy.Policy.PolicyRule value) {
-        if (policyRuleListBuilder_ == null) {
+      public Builder addPolicyRuleDeviceList(
+          int index, policy.Policy.PolicyRuleDevice value) {
+        if (policyRuleDeviceListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.add(index, value);
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.add(index, value);
           onChanged();
         } else {
-          policyRuleListBuilder_.addMessage(index, value);
+          policyRuleDeviceListBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder addPolicyRuleList(
-          policy.Policy.PolicyRule.Builder builderForValue) {
-        if (policyRuleListBuilder_ == null) {
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.add(builderForValue.build());
+      public Builder addPolicyRuleDeviceList(
+          policy.Policy.PolicyRuleDevice.Builder builderForValue) {
+        if (policyRuleDeviceListBuilder_ == null) {
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.add(builderForValue.build());
           onChanged();
         } else {
-          policyRuleListBuilder_.addMessage(builderForValue.build());
+          policyRuleDeviceListBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder addPolicyRuleList(
-          int index, policy.Policy.PolicyRule.Builder builderForValue) {
-        if (policyRuleListBuilder_ == null) {
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.add(index, builderForValue.build());
+      public Builder addPolicyRuleDeviceList(
+          int index, policy.Policy.PolicyRuleDevice.Builder builderForValue) {
+        if (policyRuleDeviceListBuilder_ == null) {
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.add(index, builderForValue.build());
           onChanged();
         } else {
-          policyRuleListBuilder_.addMessage(index, builderForValue.build());
+          policyRuleDeviceListBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder addAllPolicyRuleList(
-          java.lang.Iterable<? extends policy.Policy.PolicyRule> values) {
-        if (policyRuleListBuilder_ == null) {
-          ensurePolicyRuleListIsMutable();
+      public Builder addAllPolicyRuleDeviceList(
+          java.lang.Iterable<? extends policy.Policy.PolicyRuleDevice> values) {
+        if (policyRuleDeviceListBuilder_ == null) {
+          ensurePolicyRuleDeviceListIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, policyRuleList_);
+              values, policyRuleDeviceList_);
           onChanged();
         } else {
-          policyRuleListBuilder_.addAllMessages(values);
+          policyRuleDeviceListBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder clearPolicyRuleList() {
-        if (policyRuleListBuilder_ == null) {
-          policyRuleList_ = java.util.Collections.emptyList();
+      public Builder clearPolicyRuleDeviceList() {
+        if (policyRuleDeviceListBuilder_ == null) {
+          policyRuleDeviceList_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          policyRuleListBuilder_.clear();
+          policyRuleDeviceListBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public Builder removePolicyRuleList(int index) {
-        if (policyRuleListBuilder_ == null) {
-          ensurePolicyRuleListIsMutable();
-          policyRuleList_.remove(index);
+      public Builder removePolicyRuleDeviceList(int index) {
+        if (policyRuleDeviceListBuilder_ == null) {
+          ensurePolicyRuleDeviceListIsMutable();
+          policyRuleDeviceList_.remove(index);
           onChanged();
         } else {
-          policyRuleListBuilder_.remove(index);
+          policyRuleDeviceListBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public policy.Policy.PolicyRule.Builder getPolicyRuleListBuilder(
+      public policy.Policy.PolicyRuleDevice.Builder getPolicyRuleDeviceListBuilder(
           int index) {
-        return getPolicyRuleListFieldBuilder().getBuilder(index);
+        return getPolicyRuleDeviceListFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public policy.Policy.PolicyRuleOrBuilder getPolicyRuleListOrBuilder(
+      public policy.Policy.PolicyRuleDeviceOrBuilder getPolicyRuleDeviceListOrBuilder(
           int index) {
-        if (policyRuleListBuilder_ == null) {
-          return policyRuleList_.get(index);  } else {
-          return policyRuleListBuilder_.getMessageOrBuilder(index);
+        if (policyRuleDeviceListBuilder_ == null) {
+          return policyRuleDeviceList_.get(index);  } else {
+          return policyRuleDeviceListBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public java.util.List<? extends policy.Policy.PolicyRuleOrBuilder> 
-           getPolicyRuleListOrBuilderList() {
-        if (policyRuleListBuilder_ != null) {
-          return policyRuleListBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends policy.Policy.PolicyRuleDeviceOrBuilder> 
+           getPolicyRuleDeviceListOrBuilderList() {
+        if (policyRuleDeviceListBuilder_ != null) {
+          return policyRuleDeviceListBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(policyRuleList_);
+          return java.util.Collections.unmodifiableList(policyRuleDeviceList_);
         }
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public policy.Policy.PolicyRule.Builder addPolicyRuleListBuilder() {
-        return getPolicyRuleListFieldBuilder().addBuilder(
-            policy.Policy.PolicyRule.getDefaultInstance());
+      public policy.Policy.PolicyRuleDevice.Builder addPolicyRuleDeviceListBuilder() {
+        return getPolicyRuleDeviceListFieldBuilder().addBuilder(
+            policy.Policy.PolicyRuleDevice.getDefaultInstance());
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public policy.Policy.PolicyRule.Builder addPolicyRuleListBuilder(
+      public policy.Policy.PolicyRuleDevice.Builder addPolicyRuleDeviceListBuilder(
           int index) {
-        return getPolicyRuleListFieldBuilder().addBuilder(
-            index, policy.Policy.PolicyRule.getDefaultInstance());
+        return getPolicyRuleDeviceListFieldBuilder().addBuilder(
+            index, policy.Policy.PolicyRuleDevice.getDefaultInstance());
       }
       /**
-       * <code>repeated .policy.PolicyRule policyRuleList = 1;</code>
+       * <code>repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;</code>
        */
-      public java.util.List<policy.Policy.PolicyRule.Builder> 
-           getPolicyRuleListBuilderList() {
-        return getPolicyRuleListFieldBuilder().getBuilderList();
+      public java.util.List<policy.Policy.PolicyRuleDevice.Builder> 
+           getPolicyRuleDeviceListBuilderList() {
+        return getPolicyRuleDeviceListFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          policy.Policy.PolicyRule, policy.Policy.PolicyRule.Builder, policy.Policy.PolicyRuleOrBuilder> 
-          getPolicyRuleListFieldBuilder() {
-        if (policyRuleListBuilder_ == null) {
-          policyRuleListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              policy.Policy.PolicyRule, policy.Policy.PolicyRule.Builder, policy.Policy.PolicyRuleOrBuilder>(
-                  policyRuleList_,
+          policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleDevice.Builder, policy.Policy.PolicyRuleDeviceOrBuilder> 
+          getPolicyRuleDeviceListFieldBuilder() {
+        if (policyRuleDeviceListBuilder_ == null) {
+          policyRuleDeviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleDevice.Builder, policy.Policy.PolicyRuleDeviceOrBuilder>(
+                  policyRuleDeviceList_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          policyRuleList_ = null;
+          policyRuleDeviceList_ = null;
         }
-        return policyRuleListBuilder_;
+        return policyRuleDeviceListBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -5906,41 +8439,41 @@ public final class Policy {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:policy.PolicyRuleList)
+      // @@protoc_insertion_point(builder_scope:policy.PolicyRuleDeviceList)
     }
 
-    // @@protoc_insertion_point(class_scope:policy.PolicyRuleList)
-    private static final policy.Policy.PolicyRuleList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:policy.PolicyRuleDeviceList)
+    private static final policy.Policy.PolicyRuleDeviceList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleList();
+      DEFAULT_INSTANCE = new policy.Policy.PolicyRuleDeviceList();
     }
 
-    public static policy.Policy.PolicyRuleList getDefaultInstance() {
+    public static policy.Policy.PolicyRuleDeviceList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<PolicyRuleList>
-        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleList>() {
+    private static final com.google.protobuf.Parser<PolicyRuleDeviceList>
+        PARSER = new com.google.protobuf.AbstractParser<PolicyRuleDeviceList>() {
       @java.lang.Override
-      public PolicyRuleList parsePartialFrom(
+      public PolicyRuleDeviceList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new PolicyRuleList(input, extensionRegistry);
+        return new PolicyRuleDeviceList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<PolicyRuleList> parser() {
+    public static com.google.protobuf.Parser<PolicyRuleDeviceList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<PolicyRuleList> getParserForType() {
+    public com.google.protobuf.Parser<PolicyRuleDeviceList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public policy.Policy.PolicyRuleList getDefaultInstanceForType() {
+    public policy.Policy.PolicyRuleDeviceList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -5957,20 +8490,35 @@ public final class Policy {
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_policy_PolicyRuleState_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_policy_PolicyRuleEvent_descriptor;
+    internal_static_policy_PolicyRuleBasic_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_policy_PolicyRuleBasic_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_policy_PolicyRuleService_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_policy_PolicyRuleService_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_policy_PolicyRuleDevice_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_policy_PolicyRuleDevice_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_policy_PolicyRuleIdList_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_policy_PolicyRuleEvent_fieldAccessorTable;
+      internal_static_policy_PolicyRuleIdList_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_policy_PolicyRule_descriptor;
+    internal_static_policy_PolicyRuleServiceList_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_policy_PolicyRule_fieldAccessorTable;
+      internal_static_policy_PolicyRuleServiceList_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_policy_PolicyRuleList_descriptor;
+    internal_static_policy_PolicyRuleDeviceList_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_policy_PolicyRuleList_fieldAccessorTable;
+      internal_static_policy_PolicyRuleDeviceList_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -5983,35 +8531,49 @@ public final class Policy {
       "\n\014policy.proto\022\006policy\032\rcontext.proto\032\026p" +
       "olicy-condition.proto\032\023policy-action.pro" +
       "to\"+\n\014PolicyRuleId\022\033\n\004uuid\030\001 \001(\0132\r.conte" +
-      "xt.Uuid\"b\n\017PolicyRuleState\022#\n\014policyRule" +
-      "Id\030\001 \001(\0132\r.context.Uuid\022*\n\017policyRuleSta" +
-      "te\030\002 \001(\0162\021.policy.RuleState\"0\n\017PolicyRul" +
-      "eEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event\"\204\003" +
-      "\n\nPolicyRule\022*\n\014policyRuleId\030\001 \001(\0132\024.pol" +
-      "icy.PolicyRuleId\022.\n\016policyRuleType\030\002 \001(\016" +
-      "2\026.policy.PolicyRuleType\022\020\n\010priority\030\003 \001" +
-      "(\r\022&\n\005event\030\004 \001(\0132\027.policy.PolicyRuleEve" +
-      "nt\0222\n\rconditionList\030\005 \003(\0132\033.policy.Polic" +
-      "yRuleCondition\0220\n\017booleanOperator\030\006 \001(\0162" +
-      "\027.policy.BooleanOperator\022,\n\nactionList\030\007" +
-      " \003(\0132\030.policy.PolicyRuleAction\022%\n\tservic" +
-      "eId\030\010 \001(\0132\022.context.ServiceId\022%\n\ndeviceL" +
-      "ist\030\t \003(\0132\021.context.DeviceId\"<\n\016PolicyRu" +
-      "leList\022*\n\016policyRuleList\030\001 \003(\0132\022.policy." +
-      "PolicyRule*G\n\tRuleState\022\023\n\017POLICY_INACTI" +
-      "VE\020\000\022\022\n\016POLICY_PLANNED\020\001\022\021\n\rPOLICY_ACTIV" +
-      "E\020\002*?\n\016PolicyRuleType\022\025\n\021POLICYTYPE_DEVI" +
-      "CE\020\000\022\026\n\022POLICYTYPE_NETWORK\020\0012\214\003\n\rPolicyS" +
-      "ervice\022:\n\tPolicyAdd\022\022.policy.PolicyRule\032" +
-      "\027.policy.PolicyRuleState\"\000\022=\n\014PolicyUpda" +
-      "te\022\022.policy.PolicyRule\032\027.policy.PolicyRu" +
-      "leState\"\000\022=\n\014PolicyDelete\022\022.policy.Polic" +
-      "yRule\032\027.policy.PolicyRuleState\"\000\0227\n\tGetP" +
-      "olicy\022\024.policy.PolicyRuleId\032\022.policy.Pol" +
-      "icyRule\"\000\022B\n\023GetPolicyByDeviceId\022\021.conte" +
-      "xt.DeviceId\032\026.policy.PolicyRuleList\"\000\022D\n" +
-      "\024GetPolicyByServiceId\022\022.context.ServiceI" +
-      "d\032\026.policy.PolicyRuleList\"\000b\006proto3"
+      "xt.Uuid\"=\n\017PolicyRuleState\022*\n\017policyRule" +
+      "State\030\001 \001(\0162\021.policy.RuleState\"\256\002\n\017Polic" +
+      "yRuleBasic\022*\n\014policyRuleId\030\001 \001(\0132\024.polic" +
+      "y.PolicyRuleId\0225\n\017policyRuleState\030\002 \001(\0132" +
+      "\027.policy.PolicyRuleStateH\000\210\001\001\022\020\n\010priorit" +
+      "y\030\003 \001(\r\0222\n\rconditionList\030\004 \003(\0132\033.policy." +
+      "PolicyRuleCondition\0220\n\017booleanOperator\030\005" +
+      " \001(\0162\027.policy.BooleanOperator\022,\n\nactionL" +
+      "ist\030\006 \003(\0132\030.policy.PolicyRuleActionB\022\n\020_" +
+      "policyRuleState\"\223\001\n\021PolicyRuleService\0220\n" +
+      "\017policyRuleBasic\030\001 \001(\0132\027.policy.PolicyRu" +
+      "leBasic\022%\n\tserviceId\030\002 \001(\0132\022.context.Ser" +
+      "viceId\022%\n\ndeviceList\030\003 \003(\0132\021.context.Dev" +
+      "iceId\"k\n\020PolicyRuleDevice\0220\n\017policyRuleB" +
+      "asic\030\001 \001(\0132\027.policy.PolicyRuleBasic\022%\n\nd" +
+      "eviceList\030\002 \003(\0132\021.context.DeviceId\"B\n\020Po" +
+      "licyRuleIdList\022.\n\020policyRuleIdList\030\001 \003(\013" +
+      "2\024.policy.PolicyRuleId\"Q\n\025PolicyRuleServ" +
+      "iceList\0228\n\025policyRuleServiceList\030\001 \003(\0132\031" +
+      ".policy.PolicyRuleService\"N\n\024PolicyRuleD" +
+      "eviceList\0226\n\024policyRuleDeviceList\030\001 \003(\0132" +
+      "\030.policy.PolicyRuleDevice*\365\001\n\tRuleState\022" +
+      "\024\n\020POLICY_UNDEFINED\020\000\022\021\n\rPOLICY_FAILED\020\001" +
+      "\022\023\n\017POLICY_INSERTED\020\002\022\024\n\020POLICY_VALIDATE" +
+      "D\020\003\022\026\n\022POLICY_PROVISIONED\020\004\022\021\n\rPOLICY_AC" +
+      "TIVE\020\005\022\023\n\017POLICY_ENFORCED\020\006\022\026\n\022POLICY_IN" +
+      "EFFECTIVE\020\007\022\024\n\020POLICY_EFFECTIVE\020\010\022\022\n\016POL" +
+      "ICY_UPDATED\020\t\022\022\n\016POLICY_REMOVED\020\n2\323\004\n\rPo" +
+      "licyService\022H\n\020PolicyAddService\022\031.policy" +
+      ".PolicyRuleService\032\027.policy.PolicyRuleSt" +
+      "ate\"\000\022F\n\017PolicyAddDevice\022\030.policy.Policy" +
+      "RuleDevice\032\027.policy.PolicyRuleState\"\000\022K\n" +
+      "\023PolicyUpdateService\022\031.policy.PolicyRule" +
+      "Service\032\027.policy.PolicyRuleState\"\000\022I\n\022Po" +
+      "licyUpdateDevice\022\030.policy.PolicyRuleDevi" +
+      "ce\032\027.policy.PolicyRuleState\"\000\022?\n\014PolicyD" +
+      "elete\022\024.policy.PolicyRuleId\032\027.policy.Pol" +
+      "icyRuleState\"\000\022E\n\020GetPolicyService\022\024.pol" +
+      "icy.PolicyRuleId\032\031.policy.PolicyRuleServ" +
+      "ice\"\000\022C\n\017GetPolicyDevice\022\024.policy.Policy" +
+      "RuleId\032\030.policy.PolicyRuleDevice\"\000\022K\n\024Ge" +
+      "tPolicyByServiceId\022\022.context.ServiceId\032\035" +
+      ".policy.PolicyRuleServiceList\"\000b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -6031,25 +8593,43 @@ public final class Policy {
     internal_static_policy_PolicyRuleState_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_policy_PolicyRuleState_descriptor,
-        new java.lang.String[] { "PolicyRuleId", "PolicyRuleState", });
-    internal_static_policy_PolicyRuleEvent_descriptor =
+        new java.lang.String[] { "PolicyRuleState", });
+    internal_static_policy_PolicyRuleBasic_descriptor =
       getDescriptor().getMessageTypes().get(2);
-    internal_static_policy_PolicyRuleEvent_fieldAccessorTable = new
+    internal_static_policy_PolicyRuleBasic_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_policy_PolicyRuleEvent_descriptor,
-        new java.lang.String[] { "Event", });
-    internal_static_policy_PolicyRule_descriptor =
+        internal_static_policy_PolicyRuleBasic_descriptor,
+        new java.lang.String[] { "PolicyRuleId", "PolicyRuleState", "Priority", "ConditionList", "BooleanOperator", "ActionList", "PolicyRuleState", });
+    internal_static_policy_PolicyRuleService_descriptor =
       getDescriptor().getMessageTypes().get(3);
-    internal_static_policy_PolicyRule_fieldAccessorTable = new
+    internal_static_policy_PolicyRuleService_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_policy_PolicyRule_descriptor,
-        new java.lang.String[] { "PolicyRuleId", "PolicyRuleType", "Priority", "Event", "ConditionList", "BooleanOperator", "ActionList", "ServiceId", "DeviceList", });
-    internal_static_policy_PolicyRuleList_descriptor =
+        internal_static_policy_PolicyRuleService_descriptor,
+        new java.lang.String[] { "PolicyRuleBasic", "ServiceId", "DeviceList", });
+    internal_static_policy_PolicyRuleDevice_descriptor =
       getDescriptor().getMessageTypes().get(4);
-    internal_static_policy_PolicyRuleList_fieldAccessorTable = new
+    internal_static_policy_PolicyRuleDevice_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_policy_PolicyRuleDevice_descriptor,
+        new java.lang.String[] { "PolicyRuleBasic", "DeviceList", });
+    internal_static_policy_PolicyRuleIdList_descriptor =
+      getDescriptor().getMessageTypes().get(5);
+    internal_static_policy_PolicyRuleIdList_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_policy_PolicyRuleIdList_descriptor,
+        new java.lang.String[] { "PolicyRuleIdList", });
+    internal_static_policy_PolicyRuleServiceList_descriptor =
+      getDescriptor().getMessageTypes().get(6);
+    internal_static_policy_PolicyRuleServiceList_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_policy_PolicyRuleServiceList_descriptor,
+        new java.lang.String[] { "PolicyRuleServiceList", });
+    internal_static_policy_PolicyRuleDeviceList_descriptor =
+      getDescriptor().getMessageTypes().get(7);
+    internal_static_policy_PolicyRuleDeviceList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_policy_PolicyRuleList_descriptor,
-        new java.lang.String[] { "PolicyRuleList", });
+        internal_static_policy_PolicyRuleDeviceList_descriptor,
+        new java.lang.String[] { "PolicyRuleDeviceList", });
     context.ContextOuterClass.getDescriptor();
     policy.PolicyCondition.getDescriptor();
     policy.PolicyAction.getDescriptor();
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyService.java b/src/policy/target/generated-sources/grpc/policy/PolicyService.java
index 8c2e637f5dcf6b5783dd68900a03a72e58cc6206..277fbbfc5012570bf43a81fbb1da5e3e9211a49e 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyService.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyService.java
@@ -8,17 +8,21 @@ comments = "Source: policy.proto")
 public interface PolicyService extends MutinyService {
 
     
-    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAdd(policy.Policy.PolicyRule request);
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddService(policy.Policy.PolicyRuleService request);
     
-    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdate(policy.Policy.PolicyRule request);
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddDevice(policy.Policy.PolicyRuleDevice request);
     
-    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRule request);
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateService(policy.Policy.PolicyRuleService request);
     
-    io.smallrye.mutiny.Uni<policy.Policy.PolicyRule> getPolicy(policy.Policy.PolicyRuleId request);
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateDevice(policy.Policy.PolicyRuleDevice request);
     
-    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByDeviceId(context.ContextOuterClass.DeviceId request);
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRuleId request);
     
-    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request);
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleService> getPolicyService(policy.Policy.PolicyRuleId request);
+    
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleDevice> getPolicyDevice(policy.Policy.PolicyRuleId request);
+    
+    io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleServiceList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request);
     
     
     
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyServiceBean.java b/src/policy/target/generated-sources/grpc/policy/PolicyServiceBean.java
index 08c0e47d9fbf9b232553fd4ce1a9c7e948f42519..ada3eeaec2f779759a0b6ff7cb5724098fc9c186 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyServiceBean.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyServiceBean.java
@@ -16,23 +16,39 @@ public class PolicyServiceBean extends MutinyPolicyServiceGrpc.PolicyServiceImpl
     }
 
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAdd(policy.Policy.PolicyRule request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddService(policy.Policy.PolicyRuleService request) {
        try {
-         return delegate.policyAdd(request);
+         return delegate.policyAddService(request);
        } catch (UnsupportedOperationException e) {
           throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdate(policy.Policy.PolicyRule request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddDevice(policy.Policy.PolicyRuleDevice request) {
        try {
-         return delegate.policyUpdate(request);
+         return delegate.policyAddDevice(request);
        } catch (UnsupportedOperationException e) {
           throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRule request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateService(policy.Policy.PolicyRuleService request) {
+       try {
+         return delegate.policyUpdateService(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateDevice(policy.Policy.PolicyRuleDevice request) {
+       try {
+         return delegate.policyUpdateDevice(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRuleId request) {
        try {
          return delegate.policyDelete(request);
        } catch (UnsupportedOperationException e) {
@@ -40,23 +56,23 @@ public class PolicyServiceBean extends MutinyPolicyServiceGrpc.PolicyServiceImpl
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRule> getPolicy(policy.Policy.PolicyRuleId request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleService> getPolicyService(policy.Policy.PolicyRuleId request) {
        try {
-         return delegate.getPolicy(request);
+         return delegate.getPolicyService(request);
        } catch (UnsupportedOperationException e) {
           throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByDeviceId(context.ContextOuterClass.DeviceId request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleDevice> getPolicyDevice(policy.Policy.PolicyRuleId request) {
        try {
-         return delegate.getPolicyByDeviceId(request);
+         return delegate.getPolicyDevice(request);
        } catch (UnsupportedOperationException e) {
           throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleServiceList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
        try {
          return delegate.getPolicyByServiceId(request);
        } catch (UnsupportedOperationException e) {
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyServiceClient.java b/src/policy/target/generated-sources/grpc/policy/PolicyServiceClient.java
index 6d447719767146f965aa0f82c72c684d2c0a37bb..5f5af2002955123b646ebba86f013d79326f5b8b 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyServiceClient.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyServiceClient.java
@@ -21,27 +21,35 @@ public class PolicyServiceClient implements PolicyService, MutinyClient<MutinyPo
     }
 
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAdd(policy.Policy.PolicyRule request) {
-       return stub.policyAdd(request);
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddService(policy.Policy.PolicyRuleService request) {
+       return stub.policyAddService(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdate(policy.Policy.PolicyRule request) {
-       return stub.policyUpdate(request);
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyAddDevice(policy.Policy.PolicyRuleDevice request) {
+       return stub.policyAddDevice(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRule request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateService(policy.Policy.PolicyRuleService request) {
+       return stub.policyUpdateService(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyUpdateDevice(policy.Policy.PolicyRuleDevice request) {
+       return stub.policyUpdateDevice(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleState> policyDelete(policy.Policy.PolicyRuleId request) {
        return stub.policyDelete(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRule> getPolicy(policy.Policy.PolicyRuleId request) {
-       return stub.getPolicy(request);
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleService> getPolicyService(policy.Policy.PolicyRuleId request) {
+       return stub.getPolicyService(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByDeviceId(context.ContextOuterClass.DeviceId request) {
-       return stub.getPolicyByDeviceId(request);
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleDevice> getPolicyDevice(policy.Policy.PolicyRuleId request) {
+       return stub.getPolicyDevice(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
+    public io.smallrye.mutiny.Uni<policy.Policy.PolicyRuleServiceList> getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
        return stub.getPolicyByServiceId(request);
     }
 
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java b/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java
index 76cba32684b0d766bfc9ed58dc6f93cd239d4431..af57ac56746c2d1943a455a53b9ce6fc02228692 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java
@@ -14,89 +14,151 @@ public final class PolicyServiceGrpc {
   public static final String SERVICE_NAME = "policy.PolicyService";
 
   // Static method descriptors that strictly reflect the proto.
-  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRule,
-      policy.Policy.PolicyRuleState> getPolicyAddMethod;
+  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleService,
+      policy.Policy.PolicyRuleState> getPolicyAddServiceMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
-      fullMethodName = SERVICE_NAME + '/' + "PolicyAdd",
-      requestType = policy.Policy.PolicyRule.class,
+      fullMethodName = SERVICE_NAME + '/' + "PolicyAddService",
+      requestType = policy.Policy.PolicyRuleService.class,
       responseType = policy.Policy.PolicyRuleState.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
-  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRule,
-      policy.Policy.PolicyRuleState> getPolicyAddMethod() {
-    io.grpc.MethodDescriptor<policy.Policy.PolicyRule, policy.Policy.PolicyRuleState> getPolicyAddMethod;
-    if ((getPolicyAddMethod = PolicyServiceGrpc.getPolicyAddMethod) == null) {
+  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleService,
+      policy.Policy.PolicyRuleState> getPolicyAddServiceMethod() {
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleState> getPolicyAddServiceMethod;
+    if ((getPolicyAddServiceMethod = PolicyServiceGrpc.getPolicyAddServiceMethod) == null) {
       synchronized (PolicyServiceGrpc.class) {
-        if ((getPolicyAddMethod = PolicyServiceGrpc.getPolicyAddMethod) == null) {
-          PolicyServiceGrpc.getPolicyAddMethod = getPolicyAddMethod =
-              io.grpc.MethodDescriptor.<policy.Policy.PolicyRule, policy.Policy.PolicyRuleState>newBuilder()
+        if ((getPolicyAddServiceMethod = PolicyServiceGrpc.getPolicyAddServiceMethod) == null) {
+          PolicyServiceGrpc.getPolicyAddServiceMethod = getPolicyAddServiceMethod =
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleState>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
-              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyAdd"))
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyAddService"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  policy.Policy.PolicyRule.getDefaultInstance()))
+                  policy.Policy.PolicyRuleService.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   policy.Policy.PolicyRuleState.getDefaultInstance()))
-              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyAdd"))
+              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyAddService"))
               .build();
         }
       }
     }
-    return getPolicyAddMethod;
+    return getPolicyAddServiceMethod;
   }
 
-  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRule,
-      policy.Policy.PolicyRuleState> getPolicyUpdateMethod;
+  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleDevice,
+      policy.Policy.PolicyRuleState> getPolicyAddDeviceMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
-      fullMethodName = SERVICE_NAME + '/' + "PolicyUpdate",
-      requestType = policy.Policy.PolicyRule.class,
+      fullMethodName = SERVICE_NAME + '/' + "PolicyAddDevice",
+      requestType = policy.Policy.PolicyRuleDevice.class,
       responseType = policy.Policy.PolicyRuleState.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
-  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRule,
-      policy.Policy.PolicyRuleState> getPolicyUpdateMethod() {
-    io.grpc.MethodDescriptor<policy.Policy.PolicyRule, policy.Policy.PolicyRuleState> getPolicyUpdateMethod;
-    if ((getPolicyUpdateMethod = PolicyServiceGrpc.getPolicyUpdateMethod) == null) {
+  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleDevice,
+      policy.Policy.PolicyRuleState> getPolicyAddDeviceMethod() {
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleState> getPolicyAddDeviceMethod;
+    if ((getPolicyAddDeviceMethod = PolicyServiceGrpc.getPolicyAddDeviceMethod) == null) {
       synchronized (PolicyServiceGrpc.class) {
-        if ((getPolicyUpdateMethod = PolicyServiceGrpc.getPolicyUpdateMethod) == null) {
-          PolicyServiceGrpc.getPolicyUpdateMethod = getPolicyUpdateMethod =
-              io.grpc.MethodDescriptor.<policy.Policy.PolicyRule, policy.Policy.PolicyRuleState>newBuilder()
+        if ((getPolicyAddDeviceMethod = PolicyServiceGrpc.getPolicyAddDeviceMethod) == null) {
+          PolicyServiceGrpc.getPolicyAddDeviceMethod = getPolicyAddDeviceMethod =
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleState>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
-              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyUpdate"))
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyAddDevice"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  policy.Policy.PolicyRule.getDefaultInstance()))
+                  policy.Policy.PolicyRuleDevice.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   policy.Policy.PolicyRuleState.getDefaultInstance()))
-              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyUpdate"))
+              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyAddDevice"))
               .build();
         }
       }
     }
-    return getPolicyUpdateMethod;
+    return getPolicyAddDeviceMethod;
   }
 
-  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRule,
+  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleService,
+      policy.Policy.PolicyRuleState> getPolicyUpdateServiceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "PolicyUpdateService",
+      requestType = policy.Policy.PolicyRuleService.class,
+      responseType = policy.Policy.PolicyRuleState.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleService,
+      policy.Policy.PolicyRuleState> getPolicyUpdateServiceMethod() {
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleState> getPolicyUpdateServiceMethod;
+    if ((getPolicyUpdateServiceMethod = PolicyServiceGrpc.getPolicyUpdateServiceMethod) == null) {
+      synchronized (PolicyServiceGrpc.class) {
+        if ((getPolicyUpdateServiceMethod = PolicyServiceGrpc.getPolicyUpdateServiceMethod) == null) {
+          PolicyServiceGrpc.getPolicyUpdateServiceMethod = getPolicyUpdateServiceMethod =
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleService, policy.Policy.PolicyRuleState>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyUpdateService"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  policy.Policy.PolicyRuleService.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  policy.Policy.PolicyRuleState.getDefaultInstance()))
+              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyUpdateService"))
+              .build();
+        }
+      }
+    }
+    return getPolicyUpdateServiceMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleDevice,
+      policy.Policy.PolicyRuleState> getPolicyUpdateDeviceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "PolicyUpdateDevice",
+      requestType = policy.Policy.PolicyRuleDevice.class,
+      responseType = policy.Policy.PolicyRuleState.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleDevice,
+      policy.Policy.PolicyRuleState> getPolicyUpdateDeviceMethod() {
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleState> getPolicyUpdateDeviceMethod;
+    if ((getPolicyUpdateDeviceMethod = PolicyServiceGrpc.getPolicyUpdateDeviceMethod) == null) {
+      synchronized (PolicyServiceGrpc.class) {
+        if ((getPolicyUpdateDeviceMethod = PolicyServiceGrpc.getPolicyUpdateDeviceMethod) == null) {
+          PolicyServiceGrpc.getPolicyUpdateDeviceMethod = getPolicyUpdateDeviceMethod =
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleDevice, policy.Policy.PolicyRuleState>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyUpdateDevice"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  policy.Policy.PolicyRuleDevice.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  policy.Policy.PolicyRuleState.getDefaultInstance()))
+              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyUpdateDevice"))
+              .build();
+        }
+      }
+    }
+    return getPolicyUpdateDeviceMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId,
       policy.Policy.PolicyRuleState> getPolicyDeleteMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "PolicyDelete",
-      requestType = policy.Policy.PolicyRule.class,
+      requestType = policy.Policy.PolicyRuleId.class,
       responseType = policy.Policy.PolicyRuleState.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
-  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRule,
+  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId,
       policy.Policy.PolicyRuleState> getPolicyDeleteMethod() {
-    io.grpc.MethodDescriptor<policy.Policy.PolicyRule, policy.Policy.PolicyRuleState> getPolicyDeleteMethod;
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleState> getPolicyDeleteMethod;
     if ((getPolicyDeleteMethod = PolicyServiceGrpc.getPolicyDeleteMethod) == null) {
       synchronized (PolicyServiceGrpc.class) {
         if ((getPolicyDeleteMethod = PolicyServiceGrpc.getPolicyDeleteMethod) == null) {
           PolicyServiceGrpc.getPolicyDeleteMethod = getPolicyDeleteMethod =
-              io.grpc.MethodDescriptor.<policy.Policy.PolicyRule, policy.Policy.PolicyRuleState>newBuilder()
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleState>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PolicyDelete"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  policy.Policy.PolicyRule.getDefaultInstance()))
+                  policy.Policy.PolicyRuleId.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   policy.Policy.PolicyRuleState.getDefaultInstance()))
               .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("PolicyDelete"))
@@ -108,90 +170,90 @@ public final class PolicyServiceGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId,
-      policy.Policy.PolicyRule> getGetPolicyMethod;
+      policy.Policy.PolicyRuleService> getGetPolicyServiceMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
-      fullMethodName = SERVICE_NAME + '/' + "GetPolicy",
+      fullMethodName = SERVICE_NAME + '/' + "GetPolicyService",
       requestType = policy.Policy.PolicyRuleId.class,
-      responseType = policy.Policy.PolicyRule.class,
+      responseType = policy.Policy.PolicyRuleService.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId,
-      policy.Policy.PolicyRule> getGetPolicyMethod() {
-    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId, policy.Policy.PolicyRule> getGetPolicyMethod;
-    if ((getGetPolicyMethod = PolicyServiceGrpc.getGetPolicyMethod) == null) {
+      policy.Policy.PolicyRuleService> getGetPolicyServiceMethod() {
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleService> getGetPolicyServiceMethod;
+    if ((getGetPolicyServiceMethod = PolicyServiceGrpc.getGetPolicyServiceMethod) == null) {
       synchronized (PolicyServiceGrpc.class) {
-        if ((getGetPolicyMethod = PolicyServiceGrpc.getGetPolicyMethod) == null) {
-          PolicyServiceGrpc.getGetPolicyMethod = getGetPolicyMethod =
-              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleId, policy.Policy.PolicyRule>newBuilder()
+        if ((getGetPolicyServiceMethod = PolicyServiceGrpc.getGetPolicyServiceMethod) == null) {
+          PolicyServiceGrpc.getGetPolicyServiceMethod = getGetPolicyServiceMethod =
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleService>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
-              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetPolicy"))
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetPolicyService"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   policy.Policy.PolicyRuleId.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  policy.Policy.PolicyRule.getDefaultInstance()))
-              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("GetPolicy"))
+                  policy.Policy.PolicyRuleService.getDefaultInstance()))
+              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("GetPolicyService"))
               .build();
         }
       }
     }
-    return getGetPolicyMethod;
+    return getGetPolicyServiceMethod;
   }
 
-  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.DeviceId,
-      policy.Policy.PolicyRuleList> getGetPolicyByDeviceIdMethod;
+  private static volatile io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId,
+      policy.Policy.PolicyRuleDevice> getGetPolicyDeviceMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
-      fullMethodName = SERVICE_NAME + '/' + "GetPolicyByDeviceId",
-      requestType = context.ContextOuterClass.DeviceId.class,
-      responseType = policy.Policy.PolicyRuleList.class,
+      fullMethodName = SERVICE_NAME + '/' + "GetPolicyDevice",
+      requestType = policy.Policy.PolicyRuleId.class,
+      responseType = policy.Policy.PolicyRuleDevice.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
-  public static io.grpc.MethodDescriptor<context.ContextOuterClass.DeviceId,
-      policy.Policy.PolicyRuleList> getGetPolicyByDeviceIdMethod() {
-    io.grpc.MethodDescriptor<context.ContextOuterClass.DeviceId, policy.Policy.PolicyRuleList> getGetPolicyByDeviceIdMethod;
-    if ((getGetPolicyByDeviceIdMethod = PolicyServiceGrpc.getGetPolicyByDeviceIdMethod) == null) {
+  public static io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId,
+      policy.Policy.PolicyRuleDevice> getGetPolicyDeviceMethod() {
+    io.grpc.MethodDescriptor<policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleDevice> getGetPolicyDeviceMethod;
+    if ((getGetPolicyDeviceMethod = PolicyServiceGrpc.getGetPolicyDeviceMethod) == null) {
       synchronized (PolicyServiceGrpc.class) {
-        if ((getGetPolicyByDeviceIdMethod = PolicyServiceGrpc.getGetPolicyByDeviceIdMethod) == null) {
-          PolicyServiceGrpc.getGetPolicyByDeviceIdMethod = getGetPolicyByDeviceIdMethod =
-              io.grpc.MethodDescriptor.<context.ContextOuterClass.DeviceId, policy.Policy.PolicyRuleList>newBuilder()
+        if ((getGetPolicyDeviceMethod = PolicyServiceGrpc.getGetPolicyDeviceMethod) == null) {
+          PolicyServiceGrpc.getGetPolicyDeviceMethod = getGetPolicyDeviceMethod =
+              io.grpc.MethodDescriptor.<policy.Policy.PolicyRuleId, policy.Policy.PolicyRuleDevice>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
-              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetPolicyByDeviceId"))
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetPolicyDevice"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  context.ContextOuterClass.DeviceId.getDefaultInstance()))
+                  policy.Policy.PolicyRuleId.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  policy.Policy.PolicyRuleList.getDefaultInstance()))
-              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("GetPolicyByDeviceId"))
+                  policy.Policy.PolicyRuleDevice.getDefaultInstance()))
+              .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("GetPolicyDevice"))
               .build();
         }
       }
     }
-    return getGetPolicyByDeviceIdMethod;
+    return getGetPolicyDeviceMethod;
   }
 
   private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId,
-      policy.Policy.PolicyRuleList> getGetPolicyByServiceIdMethod;
+      policy.Policy.PolicyRuleServiceList> getGetPolicyByServiceIdMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "GetPolicyByServiceId",
       requestType = context.ContextOuterClass.ServiceId.class,
-      responseType = policy.Policy.PolicyRuleList.class,
+      responseType = policy.Policy.PolicyRuleServiceList.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId,
-      policy.Policy.PolicyRuleList> getGetPolicyByServiceIdMethod() {
-    io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId, policy.Policy.PolicyRuleList> getGetPolicyByServiceIdMethod;
+      policy.Policy.PolicyRuleServiceList> getGetPolicyByServiceIdMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId, policy.Policy.PolicyRuleServiceList> getGetPolicyByServiceIdMethod;
     if ((getGetPolicyByServiceIdMethod = PolicyServiceGrpc.getGetPolicyByServiceIdMethod) == null) {
       synchronized (PolicyServiceGrpc.class) {
         if ((getGetPolicyByServiceIdMethod = PolicyServiceGrpc.getGetPolicyByServiceIdMethod) == null) {
           PolicyServiceGrpc.getGetPolicyByServiceIdMethod = getGetPolicyByServiceIdMethod =
-              io.grpc.MethodDescriptor.<context.ContextOuterClass.ServiceId, policy.Policy.PolicyRuleList>newBuilder()
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.ServiceId, policy.Policy.PolicyRuleServiceList>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetPolicyByServiceId"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   context.ContextOuterClass.ServiceId.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  policy.Policy.PolicyRuleList.getDefaultInstance()))
+                  policy.Policy.PolicyRuleServiceList.getDefaultInstance()))
               .setSchemaDescriptor(new PolicyServiceMethodDescriptorSupplier("GetPolicyByServiceId"))
               .build();
         }
@@ -250,89 +312,117 @@ public final class PolicyServiceGrpc {
 
     /**
      */
-    public void policyAdd(policy.Policy.PolicyRule request,
+    public void policyAddService(policy.Policy.PolicyRuleService request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyAddServiceMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void policyAddDevice(policy.Policy.PolicyRuleDevice request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyAddDeviceMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void policyUpdateService(policy.Policy.PolicyRuleService request,
         io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
-      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyAddMethod(), responseObserver);
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyUpdateServiceMethod(), responseObserver);
     }
 
     /**
      */
-    public void policyUpdate(policy.Policy.PolicyRule request,
+    public void policyUpdateDevice(policy.Policy.PolicyRuleDevice request,
         io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
-      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyUpdateMethod(), responseObserver);
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyUpdateDeviceMethod(), responseObserver);
     }
 
     /**
      */
-    public void policyDelete(policy.Policy.PolicyRule request,
+    public void policyDelete(policy.Policy.PolicyRuleId request,
         io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyDeleteMethod(), responseObserver);
     }
 
     /**
      */
-    public void getPolicy(policy.Policy.PolicyRuleId request,
-        io.grpc.stub.StreamObserver<policy.Policy.PolicyRule> responseObserver) {
-      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyMethod(), responseObserver);
+    public void getPolicyService(policy.Policy.PolicyRuleId request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleService> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyServiceMethod(), responseObserver);
     }
 
     /**
      */
-    public void getPolicyByDeviceId(context.ContextOuterClass.DeviceId request,
-        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList> responseObserver) {
-      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyByDeviceIdMethod(), responseObserver);
+    public void getPolicyDevice(policy.Policy.PolicyRuleId request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleDevice> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyDeviceMethod(), responseObserver);
     }
 
     /**
      */
     public void getPolicyByServiceId(context.ContextOuterClass.ServiceId request,
-        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList> responseObserver) {
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleServiceList> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyByServiceIdMethod(), responseObserver);
     }
 
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
           .addMethod(
-            getPolicyAddMethod(),
+            getPolicyAddServiceMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
-                policy.Policy.PolicyRule,
+                policy.Policy.PolicyRuleService,
                 policy.Policy.PolicyRuleState>(
-                  this, METHODID_POLICY_ADD)))
+                  this, METHODID_POLICY_ADD_SERVICE)))
           .addMethod(
-            getPolicyUpdateMethod(),
+            getPolicyAddDeviceMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
-                policy.Policy.PolicyRule,
+                policy.Policy.PolicyRuleDevice,
                 policy.Policy.PolicyRuleState>(
-                  this, METHODID_POLICY_UPDATE)))
+                  this, METHODID_POLICY_ADD_DEVICE)))
+          .addMethod(
+            getPolicyUpdateServiceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                policy.Policy.PolicyRuleService,
+                policy.Policy.PolicyRuleState>(
+                  this, METHODID_POLICY_UPDATE_SERVICE)))
+          .addMethod(
+            getPolicyUpdateDeviceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                policy.Policy.PolicyRuleDevice,
+                policy.Policy.PolicyRuleState>(
+                  this, METHODID_POLICY_UPDATE_DEVICE)))
           .addMethod(
             getPolicyDeleteMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
-                policy.Policy.PolicyRule,
+                policy.Policy.PolicyRuleId,
                 policy.Policy.PolicyRuleState>(
                   this, METHODID_POLICY_DELETE)))
           .addMethod(
-            getGetPolicyMethod(),
+            getGetPolicyServiceMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
                 policy.Policy.PolicyRuleId,
-                policy.Policy.PolicyRule>(
-                  this, METHODID_GET_POLICY)))
+                policy.Policy.PolicyRuleService>(
+                  this, METHODID_GET_POLICY_SERVICE)))
           .addMethod(
-            getGetPolicyByDeviceIdMethod(),
+            getGetPolicyDeviceMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
-                context.ContextOuterClass.DeviceId,
-                policy.Policy.PolicyRuleList>(
-                  this, METHODID_GET_POLICY_BY_DEVICE_ID)))
+                policy.Policy.PolicyRuleId,
+                policy.Policy.PolicyRuleDevice>(
+                  this, METHODID_GET_POLICY_DEVICE)))
           .addMethod(
             getGetPolicyByServiceIdMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
                 context.ContextOuterClass.ServiceId,
-                policy.Policy.PolicyRuleList>(
+                policy.Policy.PolicyRuleServiceList>(
                   this, METHODID_GET_POLICY_BY_SERVICE_ID)))
           .build();
     }
@@ -354,23 +444,39 @@ public final class PolicyServiceGrpc {
 
     /**
      */
-    public void policyAdd(policy.Policy.PolicyRule request,
+    public void policyAddService(policy.Policy.PolicyRuleService request,
         io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
-          getChannel().newCall(getPolicyAddMethod(), getCallOptions()), request, responseObserver);
+          getChannel().newCall(getPolicyAddServiceMethod(), getCallOptions()), request, responseObserver);
     }
 
     /**
      */
-    public void policyUpdate(policy.Policy.PolicyRule request,
+    public void policyAddDevice(policy.Policy.PolicyRuleDevice request,
         io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
-          getChannel().newCall(getPolicyUpdateMethod(), getCallOptions()), request, responseObserver);
+          getChannel().newCall(getPolicyAddDeviceMethod(), getCallOptions()), request, responseObserver);
     }
 
     /**
      */
-    public void policyDelete(policy.Policy.PolicyRule request,
+    public void policyUpdateService(policy.Policy.PolicyRuleService request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getPolicyUpdateServiceMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void policyUpdateDevice(policy.Policy.PolicyRuleDevice request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getPolicyUpdateDeviceMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void policyDelete(policy.Policy.PolicyRuleId request,
         io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getPolicyDeleteMethod(), getCallOptions()), request, responseObserver);
@@ -378,24 +484,24 @@ public final class PolicyServiceGrpc {
 
     /**
      */
-    public void getPolicy(policy.Policy.PolicyRuleId request,
-        io.grpc.stub.StreamObserver<policy.Policy.PolicyRule> responseObserver) {
+    public void getPolicyService(policy.Policy.PolicyRuleId request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleService> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
-          getChannel().newCall(getGetPolicyMethod(), getCallOptions()), request, responseObserver);
+          getChannel().newCall(getGetPolicyServiceMethod(), getCallOptions()), request, responseObserver);
     }
 
     /**
      */
-    public void getPolicyByDeviceId(context.ContextOuterClass.DeviceId request,
-        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList> responseObserver) {
+    public void getPolicyDevice(policy.Policy.PolicyRuleId request,
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleDevice> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
-          getChannel().newCall(getGetPolicyByDeviceIdMethod(), getCallOptions()), request, responseObserver);
+          getChannel().newCall(getGetPolicyDeviceMethod(), getCallOptions()), request, responseObserver);
     }
 
     /**
      */
     public void getPolicyByServiceId(context.ContextOuterClass.ServiceId request,
-        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList> responseObserver) {
+        io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleServiceList> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getGetPolicyByServiceIdMethod(), getCallOptions()), request, responseObserver);
     }
@@ -417,42 +523,56 @@ public final class PolicyServiceGrpc {
 
     /**
      */
-    public policy.Policy.PolicyRuleState policyAdd(policy.Policy.PolicyRule request) {
+    public policy.Policy.PolicyRuleState policyAddService(policy.Policy.PolicyRuleService request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
-          getChannel(), getPolicyAddMethod(), getCallOptions(), request);
+          getChannel(), getPolicyAddServiceMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public policy.Policy.PolicyRuleState policyUpdate(policy.Policy.PolicyRule request) {
+    public policy.Policy.PolicyRuleState policyAddDevice(policy.Policy.PolicyRuleDevice request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
-          getChannel(), getPolicyUpdateMethod(), getCallOptions(), request);
+          getChannel(), getPolicyAddDeviceMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public policy.Policy.PolicyRuleState policyDelete(policy.Policy.PolicyRule request) {
+    public policy.Policy.PolicyRuleState policyUpdateService(policy.Policy.PolicyRuleService request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getPolicyUpdateServiceMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public policy.Policy.PolicyRuleState policyUpdateDevice(policy.Policy.PolicyRuleDevice request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getPolicyUpdateDeviceMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public policy.Policy.PolicyRuleState policyDelete(policy.Policy.PolicyRuleId request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getPolicyDeleteMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public policy.Policy.PolicyRule getPolicy(policy.Policy.PolicyRuleId request) {
+    public policy.Policy.PolicyRuleService getPolicyService(policy.Policy.PolicyRuleId request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
-          getChannel(), getGetPolicyMethod(), getCallOptions(), request);
+          getChannel(), getGetPolicyServiceMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public policy.Policy.PolicyRuleList getPolicyByDeviceId(context.ContextOuterClass.DeviceId request) {
+    public policy.Policy.PolicyRuleDevice getPolicyDevice(policy.Policy.PolicyRuleId request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
-          getChannel(), getGetPolicyByDeviceIdMethod(), getCallOptions(), request);
+          getChannel(), getGetPolicyDeviceMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public policy.Policy.PolicyRuleList getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
+    public policy.Policy.PolicyRuleServiceList getPolicyByServiceId(context.ContextOuterClass.ServiceId request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getGetPolicyByServiceIdMethod(), getCallOptions(), request);
     }
@@ -474,59 +594,77 @@ public final class PolicyServiceGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyAdd(
-        policy.Policy.PolicyRule request) {
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyAddService(
+        policy.Policy.PolicyRuleService request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getPolicyAddServiceMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyAddDevice(
+        policy.Policy.PolicyRuleDevice request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getPolicyAddDeviceMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyUpdateService(
+        policy.Policy.PolicyRuleService request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
-          getChannel().newCall(getPolicyAddMethod(), getCallOptions()), request);
+          getChannel().newCall(getPolicyUpdateServiceMethod(), getCallOptions()), request);
     }
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyUpdate(
-        policy.Policy.PolicyRule request) {
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyUpdateDevice(
+        policy.Policy.PolicyRuleDevice request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
-          getChannel().newCall(getPolicyUpdateMethod(), getCallOptions()), request);
+          getChannel().newCall(getPolicyUpdateDeviceMethod(), getCallOptions()), request);
     }
 
     /**
      */
     public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleState> policyDelete(
-        policy.Policy.PolicyRule request) {
+        policy.Policy.PolicyRuleId request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getPolicyDeleteMethod(), getCallOptions()), request);
     }
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRule> getPolicy(
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleService> getPolicyService(
         policy.Policy.PolicyRuleId request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
-          getChannel().newCall(getGetPolicyMethod(), getCallOptions()), request);
+          getChannel().newCall(getGetPolicyServiceMethod(), getCallOptions()), request);
     }
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleList> getPolicyByDeviceId(
-        context.ContextOuterClass.DeviceId request) {
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleDevice> getPolicyDevice(
+        policy.Policy.PolicyRuleId request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
-          getChannel().newCall(getGetPolicyByDeviceIdMethod(), getCallOptions()), request);
+          getChannel().newCall(getGetPolicyDeviceMethod(), getCallOptions()), request);
     }
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleList> getPolicyByServiceId(
+    public com.google.common.util.concurrent.ListenableFuture<policy.Policy.PolicyRuleServiceList> getPolicyByServiceId(
         context.ContextOuterClass.ServiceId request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getGetPolicyByServiceIdMethod(), getCallOptions()), request);
     }
   }
 
-  private static final int METHODID_POLICY_ADD = 0;
-  private static final int METHODID_POLICY_UPDATE = 1;
-  private static final int METHODID_POLICY_DELETE = 2;
-  private static final int METHODID_GET_POLICY = 3;
-  private static final int METHODID_GET_POLICY_BY_DEVICE_ID = 4;
-  private static final int METHODID_GET_POLICY_BY_SERVICE_ID = 5;
+  private static final int METHODID_POLICY_ADD_SERVICE = 0;
+  private static final int METHODID_POLICY_ADD_DEVICE = 1;
+  private static final int METHODID_POLICY_UPDATE_SERVICE = 2;
+  private static final int METHODID_POLICY_UPDATE_DEVICE = 3;
+  private static final int METHODID_POLICY_DELETE = 4;
+  private static final int METHODID_GET_POLICY_SERVICE = 5;
+  private static final int METHODID_GET_POLICY_DEVICE = 6;
+  private static final int METHODID_GET_POLICY_BY_SERVICE_ID = 7;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -545,29 +683,37 @@ public final class PolicyServiceGrpc {
     @java.lang.SuppressWarnings("unchecked")
     public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
       switch (methodId) {
-        case METHODID_POLICY_ADD:
-          serviceImpl.policyAdd((policy.Policy.PolicyRule) request,
+        case METHODID_POLICY_ADD_SERVICE:
+          serviceImpl.policyAddService((policy.Policy.PolicyRuleService) request,
+              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver);
+          break;
+        case METHODID_POLICY_ADD_DEVICE:
+          serviceImpl.policyAddDevice((policy.Policy.PolicyRuleDevice) request,
+              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver);
+          break;
+        case METHODID_POLICY_UPDATE_SERVICE:
+          serviceImpl.policyUpdateService((policy.Policy.PolicyRuleService) request,
               (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver);
           break;
-        case METHODID_POLICY_UPDATE:
-          serviceImpl.policyUpdate((policy.Policy.PolicyRule) request,
+        case METHODID_POLICY_UPDATE_DEVICE:
+          serviceImpl.policyUpdateDevice((policy.Policy.PolicyRuleDevice) request,
               (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver);
           break;
         case METHODID_POLICY_DELETE:
-          serviceImpl.policyDelete((policy.Policy.PolicyRule) request,
+          serviceImpl.policyDelete((policy.Policy.PolicyRuleId) request,
               (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleState>) responseObserver);
           break;
-        case METHODID_GET_POLICY:
-          serviceImpl.getPolicy((policy.Policy.PolicyRuleId) request,
-              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRule>) responseObserver);
+        case METHODID_GET_POLICY_SERVICE:
+          serviceImpl.getPolicyService((policy.Policy.PolicyRuleId) request,
+              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleService>) responseObserver);
           break;
-        case METHODID_GET_POLICY_BY_DEVICE_ID:
-          serviceImpl.getPolicyByDeviceId((context.ContextOuterClass.DeviceId) request,
-              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList>) responseObserver);
+        case METHODID_GET_POLICY_DEVICE:
+          serviceImpl.getPolicyDevice((policy.Policy.PolicyRuleId) request,
+              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleDevice>) responseObserver);
           break;
         case METHODID_GET_POLICY_BY_SERVICE_ID:
           serviceImpl.getPolicyByServiceId((context.ContextOuterClass.ServiceId) request,
-              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleList>) responseObserver);
+              (io.grpc.stub.StreamObserver<policy.Policy.PolicyRuleServiceList>) responseObserver);
           break;
         default:
           throw new AssertionError();
@@ -630,11 +776,13 @@ public final class PolicyServiceGrpc {
         if (result == null) {
           serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
               .setSchemaDescriptor(new PolicyServiceFileDescriptorSupplier())
-              .addMethod(getPolicyAddMethod())
-              .addMethod(getPolicyUpdateMethod())
+              .addMethod(getPolicyAddServiceMethod())
+              .addMethod(getPolicyAddDeviceMethod())
+              .addMethod(getPolicyUpdateServiceMethod())
+              .addMethod(getPolicyUpdateDeviceMethod())
               .addMethod(getPolicyDeleteMethod())
-              .addMethod(getGetPolicyMethod())
-              .addMethod(getGetPolicyByDeviceIdMethod())
+              .addMethod(getGetPolicyServiceMethod())
+              .addMethod(getGetPolicyDeviceMethod())
               .addMethod(getGetPolicyByServiceIdMethod())
               .build();
         }
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index 3625e9d859ea0a58fc1aff47eeab15cb0434ff03..97929a86330aa71f708199fa3333764e0fd31e38 100644
--- a/src/policy/target/kubernetes/kubernetes.yml
+++ b/src/policy/target/kubernetes/kubernetes.yml
@@ -3,8 +3,8 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 54b760b9045db694a08b0f291f52b28aa4d8c5d2
-    app.quarkus.io/build-timestamp: 2022-05-23 - 13:57:10 +0000
+    app.quarkus.io/commit-id: cfe69c57feb1d488c2dda620021e3c62d67fc3d3
+    app.quarkus.io/build-timestamp: 2022-07-14 - 07:52:22 +0000
   labels:
     app.kubernetes.io/name: policyservice
     app: policyservice
@@ -14,9 +14,9 @@ spec:
     - name: http
       port: 8080
       targetPort: 8080
-    - name: grpc-server
-      port: 9999
-      targetPort: 9999
+    - name: grpc
+      port: 6060
+      targetPort: 6060
   selector:
     app.kubernetes.io/name: policyservice
   type: ClusterIP
@@ -25,8 +25,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 54b760b9045db694a08b0f291f52b28aa4d8c5d2
-    app.quarkus.io/build-timestamp: 2022-05-23 - 13:57:10 +0000
+    app.quarkus.io/commit-id: cfe69c57feb1d488c2dda620021e3c62d67fc3d3
+    app.quarkus.io/build-timestamp: 2022-07-14 - 07:52:22 +0000
   labels:
     app: policyservice
     app.kubernetes.io/name: policyservice
@@ -39,8 +39,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 54b760b9045db694a08b0f291f52b28aa4d8c5d2
-        app.quarkus.io/build-timestamp: 2022-05-23 - 13:57:10 +0000
+        app.quarkus.io/commit-id: cfe69c57feb1d488c2dda620021e3c62d67fc3d3
+        app.quarkus.io/build-timestamp: 2022-07-14 - 07:52:22 +0000
       labels:
         app: policyservice
         app.kubernetes.io/name: policyservice
@@ -51,6 +51,12 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
+            - name: SERVICE_SERVICE_HOST
+              value: serviceservice
+            - name: CONTEXT_SERVICE_HOST
+              value: contextservice
           image: registry.gitlab.com/teraflow-h2020/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe:
@@ -68,8 +74,8 @@ spec:
             - containerPort: 8080
               name: http
               protocol: TCP
-            - containerPort: 9999
-              name: grpc-server
+            - containerPort: 6060
+              name: grpc
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
diff --git a/src/webui/Config.py b/src/webui/Config.py
index e7720a405e2874c3679f9f507df2fdffc610f84a..ffa55f5e3562bff75f2e18e411e2d9229c22f19f 100644
--- a/src/webui/Config.py
+++ b/src/webui/Config.py
@@ -36,3 +36,6 @@ CONTEXT_SERVICE_PORT = int(os.environ.get('CONTEXTSERVICE_SERVICE_PORT_GRPC', 10
 
 DEVICE_SERVICE_ADDRESS = os.environ.get('DEVICESERVICE_SERVICE_HOST', 'deviceservice')
 DEVICE_SERVICE_PORT = int(os.environ.get('DEVICESERVICE_SERVICE_PORT_GRPC', 2020))
+
+SERVICE_SERVICE_ADDRESS = os.environ.get('SERVICESERVICE_SERVICE_HOST', 'serviceservice')
+SERVICE_SERVICE_PORT = int(os.environ.get('SERVICESERVICE_SERVICE_PORT_GRPC', 3030))
diff --git a/src/webui/Dockerfile b/src/webui/Dockerfile
index c22ba2e8b4fe895a93ee944a740a4108ed1c0e4c..1e55ee411ed7f7c89a3d0ecad982f877c697057f 100644
--- a/src/webui/Dockerfile
+++ b/src/webui/Dockerfile
@@ -54,6 +54,9 @@ COPY --chown=webui:webui context/client/. context/client
 COPY --chown=webui:webui device/__init__.py device/__init__.py
 COPY --chown=webui:webui device/proto/. device/proto
 COPY --chown=webui:webui device/client/. device/client
+COPY --chown=webui:webui service/__init__.py service/__init__.py
+COPY --chown=webui:webui service/proto/. service/proto
+COPY --chown=webui:webui service/client/. service/client
 COPY --chown=webui:webui webui/. webui
 
 # Start webui service
diff --git a/src/webui/grafana_dashboard.json b/src/webui/grafana_dashboard.json
index afe3ea1260cae8781fea1e29e30e2d1651ab7c2e..a845ac20c7861b86fd1931452b7802b3f1e57aa8 100644
--- a/src/webui/grafana_dashboard.json
+++ b/src/webui/grafana_dashboard.json
@@ -227,12 +227,12 @@
           "current": {
             "selected": true,
             "text": [
-              "R1-INF",
-              "R3-INF"
+              "R1-EMU",
+              "R3-EMU"
             ],
             "value": [
-              "R1-INF",
-              "R3-INF"
+              "R1-EMU",
+              "R3-EMU"
             ]
           },
           "datasource": null,
@@ -257,12 +257,10 @@
           "current": {
             "selected": true,
             "text": [
-              "13/2/0",
-              "13/2/1"
+              "13/1/2"
             ],
             "value": [
-              "13/2/0",
-              "13/2/1"
+              "13/1/2"
             ]
           },
           "datasource": null,
diff --git a/src/webui/service/__init__.py b/src/webui/service/__init__.py
index d9755563ad60b2b897d96540a7ceaaa43f4d36dc..9ea6e58214c61fb7f693912097af2b4a17628371 100644
--- a/src/webui/service/__init__.py
+++ b/src/webui/service/__init__.py
@@ -51,8 +51,17 @@ def readiness():
 def from_json(json_str):
     return json.loads(json_str)
 
+class SetSubAppMiddleware():
+    def __init__(self, app, web_app_root):
+        self.app = app
+        self.web_app_root = web_app_root
 
-def create_app(use_config=None):
+    def __call__(self, environ, start_response):
+        environ['SCRIPT_NAME'] = self.web_app_root
+        environ['APPLICATION_ROOT'] = self.web_app_root
+        return self.app(environ, start_response)
+
+def create_app(use_config=None, web_app_root=None):
     app = Flask(__name__)
     if use_config:
         app.config.from_mapping(**use_config)
@@ -64,6 +73,9 @@ def create_app(use_config=None):
     
     app.register_blueprint(healthz, url_prefix='/healthz')
 
+    from webui.service.js.routes import js
+    app.register_blueprint(js)
+
     from webui.service.main.routes import main
     app.register_blueprint(main)
 
@@ -80,4 +92,6 @@ def create_app(use_config=None):
     
     app.jinja_env.globals.update(get_working_context=get_working_context)
 
+    if web_app_root is not None:
+        app.wsgi_app = SetSubAppMiddleware(app.wsgi_app, web_app_root)
     return app
diff --git a/src/webui/service/__main__.py b/src/webui/service/__main__.py
index 5dd20aab74751390a11b32e9ae2c63aadb9e364e..9a41c91a1e8a519fef1ed244264c4692cac62756 100644
--- a/src/webui/service/__main__.py
+++ b/src/webui/service/__main__.py
@@ -24,6 +24,7 @@ def main():
     metrics_port = os.environ.get('METRICS_PORT',              METRICS_PORT      )
     host         = os.environ.get('HOST',                      HOST              )
     debug        = os.environ.get('DEBUG',                     DEBUG             )
+    web_app_root = os.environ.get('WEBUI_APPLICATION_ROOT',    None              )
 
     logging.basicConfig(level=log_level)
     logger = logging.getLogger(__name__)
@@ -40,7 +41,7 @@ def main():
     app = create_app(use_config={
         'SECRET_KEY': SECRET_KEY,
         'MAX_CONTENT_LENGTH': MAX_CONTENT_LENGTH,
-    })
+    }, web_app_root=web_app_root)
     app.run(host=host, port=service_port, debug=debug)
 
     logger.info('Bye')
diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py
index 1f9a6783c54ef14a72e9afb6db8e15b04fa20872..3e78222e9edbcbee6c52e111ac422e92e862011e 100644
--- a/src/webui/service/device/routes.py
+++ b/src/webui/service/device/routes.py
@@ -123,11 +123,10 @@ def delete(device_uuid):
         request.device_uuid.uuid = device_uuid
         device_client.connect()
         response = device_client.DeleteDevice(request)
-
         device_client.close()
 
-        flash('Device deleted successfully!', 'success')
+        flash('Device "{:s}" deleted successfully!'.format(device_uuid), 'success')
     except Exception as e:
-        flash(f'Problem deleting the device. {e.details()}', 'danger')
-
+        flash('Problem deleting device "{:s}": {:s}'.format(device_uuid, str(e.details())), 'danger')
+        current_app.logger.exception(e)
     return redirect(url_for('device.home'))
diff --git a/src/webui/service/js/__init__.py b/src/webui/service/js/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/webui/service/js/__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/webui/service/js/routes.py b/src/webui/service/js/routes.py
new file mode 100644
index 0000000000000000000000000000000000000000..fee4109df048a29954ce924ef57ec62d6adc27fb
--- /dev/null
+++ b/src/webui/service/js/routes.py
@@ -0,0 +1,25 @@
+# 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 flask import render_template, Blueprint
+
+js = Blueprint('js', __name__, url_prefix='/js')
+
+@js.get('site.js')
+def site_js():
+    return render_template('js/site.js')
+
+@js.get('topology.js')
+def topology_js():
+    return render_template('js/topology.js')
diff --git a/src/webui/service/service/routes.py b/src/webui/service/service/routes.py
index 17efe1c0973550f6b185dc4ce0a0f88e9e3a82d8..5eb18b2a1d25f743733dab567671ffe158bb3b57 100644
--- a/src/webui/service/service/routes.py
+++ b/src/webui/service/service/routes.py
@@ -15,14 +15,16 @@
 import grpc
 from flask import current_app, redirect, render_template, Blueprint, flash, session, url_for
 from context.proto.context_pb2 import Service, ServiceId
-from webui.Config import CONTEXT_SERVICE_ADDRESS, CONTEXT_SERVICE_PORT
+from webui.Config import CONTEXT_SERVICE_ADDRESS, CONTEXT_SERVICE_PORT, SERVICE_SERVICE_ADDRESS, SERVICE_SERVICE_PORT
 from context.client.ContextClient import ContextClient
+from service.client.ServiceClient import ServiceClient
 from webui.proto.context_pb2 import ContextId, ServiceList, ServiceTypeEnum, ServiceStatusEnum, ConfigActionEnum
 
 
 service = Blueprint('service', __name__, url_prefix='/service')
 
 context_client: ContextClient = ContextClient(CONTEXT_SERVICE_ADDRESS, CONTEXT_SERVICE_PORT)
+service_client: ServiceClient = ServiceClient(SERVICE_SERVICE_ADDRESS, SERVICE_SERVICE_PORT)
 
 @service.get('/')
 def home():
@@ -61,7 +63,7 @@ def add():
     return render_template('service/home.html')
 
 
-@service.get('detail/<path:service_uuid>')
+@service.get('<path:service_uuid>/detail')
 def detail(service_uuid: str):
     context_uuid = session.get('context_uuid', '-')
     if context_uuid == "-":
@@ -82,6 +84,23 @@ def detail(service_uuid: str):
     return render_template('service/detail.html', service=response)
 
 
-@service.get('delete/<path:service_uuid>')
+@service.get('<path:service_uuid>/delete')
 def delete(service_uuid: str):
-    pass
+    context_uuid = session.get('context_uuid', '-')
+    if context_uuid == "-":
+        flash("Please select a context!", "warning")
+        return redirect(url_for("main.home"))
+
+    try:
+        request: ServiceId = ServiceId()
+        request.service_uuid.uuid = service_uuid
+        request.context_id.context_uuid.uuid = context_uuid
+        service_client.connect()
+        response = service_client.DeleteService(request)
+        service_client.close()
+
+        flash('Service "{:s}" deleted successfully!'.format(service_uuid), 'success')
+    except Exception as e:
+        flash('Problem deleting service "{:s}": {:s}'.format(service_uuid, str(e.details())), 'danger')
+        current_app.logger.exception(e)
+    return redirect(url_for('service.home'))
diff --git a/src/webui/service/templates/base.html b/src/webui/service/templates/base.html
index d5f748eae43531bc58951aa44b24c5272d230883..a24edaa541a09c7a22f52d9bf3e705c62c6ef1c6 100644
--- a/src/webui/service/templates/base.html
+++ b/src/webui/service/templates/base.html
@@ -31,7 +31,7 @@
   </head>
   <body>
       <div id="teraflow-branding" style="width: 260px; margin: 7px;">
-        <a href="/" title="Home" rel="home" id="main-logo" class="site-logo site-logo-pages">
+        <a href="{{ url_for('main.home') }}" title="Home" rel="home" id="main-logo" class="site-logo site-logo-pages">
             <svg id="Capa_1" data-name="Capa 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 436.3 132.1"><defs><style>.cls-1{fill:#36a9e1;}.cls-2{fill:#1d71b8;}.cls-3{fill:none;stroke-width:2.52px;}.cls-10,.cls-3,.cls-4,.cls-5,.cls-7,.cls-8,.cls-9{stroke:#0f77b6;}.cls-3,.cls-4,.cls-8{stroke-miterlimit:10;}.cls-10,.cls-4,.cls-5,.cls-7,.cls-8,.cls-9{fill:#fff;}.cls-4{stroke-width:0.73px;}.cls-5,.cls-7{stroke-miterlimit:10;}.cls-5{stroke-width:0.75px;}.cls-6{fill:#0f77b6;}.cls-7{stroke-width:0.72px;}.cls-8{stroke-width:0.7px;}.cls-9{stroke-miterlimit:10;stroke-width:0.69px;}.cls-10{stroke-miterlimit:10;stroke-width:0.7px;}</style></defs><path class="cls-1" d="M96,57V51.3h44.1V57H121v52.3h-5.9V57Z"></path><path class="cls-1" d="M168.9,95.1l4.7,2.4a26,26,0,0,1-5.3,7.3,22.27,22.27,0,0,1-6.7,4.2,22.64,22.64,0,0,1-8.5,1.4c-7,0-12.5-2.3-16.4-6.9a23.53,23.53,0,0,1-5.9-15.6,23,23,0,0,1,5-14.5c4.2-5.4,9.9-8.1,17-8.1,7.3,0,13.2,2.8,17.5,8.3,3.1,3.9,4.7,8.8,4.7,14.7H136.4a17.48,17.48,0,0,0,4.8,12.3,15.26,15.26,0,0,0,11.4,4.8,20,20,0,0,0,6.4-1.1,19.3,19.3,0,0,0,5.3-3A33.07,33.07,0,0,0,168.9,95.1Zm0-11.6a18.66,18.66,0,0,0-3.2-7.1,15.25,15.25,0,0,0-5.6-4.3,16.87,16.87,0,0,0-7.3-1.6,16.06,16.06,0,0,0-10.9,4.1,18.15,18.15,0,0,0-5,8.9Z"></path><path class="cls-1" d="M182,66.4h5.6v6.3a20,20,0,0,1,5.3-5.5,10.67,10.67,0,0,1,5.8-1.8,9.87,9.87,0,0,1,4.9,1.5l-2.9,4.7a7.52,7.52,0,0,0-2.9-.7,8.09,8.09,0,0,0-5.3,2.3,14.64,14.64,0,0,0-3.9,7c-.7,2.4-1,7.4-1,14.8v14.5H182Z"></path><path class="cls-1" d="M246.2,66.4v42.9h-5.4V102a23.11,23.11,0,0,1-7.8,6.3,21.23,21.23,0,0,1-9.4,2.1,21,21,0,0,1-15.6-6.6,23.07,23.07,0,0,1,.1-32,21.23,21.23,0,0,1,15.7-6.6,20,20,0,0,1,17.1,8.9V66.2h5.3Zm-22.1,4.2a16.67,16.67,0,0,0-8.5,2.3,15.93,15.93,0,0,0-6.2,6.4,17.68,17.68,0,0,0-2.3,8.7,18.26,18.26,0,0,0,2.3,8.7,15.93,15.93,0,0,0,6.2,6.4,16.58,16.58,0,0,0,8.4,2.3,17.59,17.59,0,0,0,8.6-2.3,15.42,15.42,0,0,0,6.2-6.2,17.17,17.17,0,0,0,2.2-8.8,16.73,16.73,0,0,0-4.9-12.4A15.8,15.8,0,0,0,224.1,70.6Z"></path><path class="cls-2" d="M259.5,51.3h29.1V57H265.3V75.2h23.3v5.7H265.3v28.5h-5.8V51.3Z"></path><path class="cls-2" d="M296.9,49.9h5.5v59.5h-5.5Z"></path><path class="cls-2" d="M330.5,65.3a21.1,21.1,0,0,1,16.4,7.2A22.55,22.55,0,0,1,352.8,88a22.24,22.24,0,0,1-6.3,15.7c-4.2,4.5-9.5,6.7-16.1,6.7s-12-2.2-16.1-6.7A22.24,22.24,0,0,1,308,88a22.73,22.73,0,0,1,5.9-15.5A21.81,21.81,0,0,1,330.5,65.3Zm0,5.4a15.83,15.83,0,0,0-11.8,5.1,17,17,0,0,0-4.9,12.3,17.68,17.68,0,0,0,2.3,8.7,15.19,15.19,0,0,0,6.1,6.2,16.48,16.48,0,0,0,8.4,2.2A16,16,0,0,0,339,103a15.82,15.82,0,0,0,6.1-6.2,17.68,17.68,0,0,0,2.3-8.7,17.07,17.07,0,0,0-5-12.3A16.2,16.2,0,0,0,330.5,70.7Z"></path><path class="cls-2" d="M351.2,66.4h5.7L370,97.6l13.7-31.1h1l13.8,31.1,13.4-31.1h5.7L399,109.3h-1L384.3,78.6l-13.7,30.7h-1Z"></path><polyline class="cls-3" points="51 105 51 41.2 27 41.2"></polyline><polyline class="cls-3" points="38.1 33.8 56.4 33.8 56.4 93"></polyline><polyline class="cls-3" points="79.9 33.8 61.5 33.8 61.5 79.2"></polyline><polyline class="cls-3" points="90.7 41.2 66.7 41.2 66.7 105"></polyline><line class="cls-3" x1="83.1" y1="62.6" x2="66.7" y2="62.6"></line><circle class="cls-4" cx="27" cy="41.2" r="5.3"></circle><path class="cls-1" d="M23.3,41.2a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,23.3,41.2Z"></path><circle class="cls-5" cx="51" cy="105" r="5.4"></circle><path class="cls-1" d="M47.3,105a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,47.3,105Z"></path><circle class="cls-6" cx="56.36" cy="93.02" r="3.4"></circle><circle class="cls-6" cx="61.5" cy="79.2" r="2.8"></circle><circle class="cls-7" cx="66.7" cy="105.01" r="5.3"></circle><path class="cls-1" d="M63,105a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,63,105Z"></path><circle class="cls-8" cx="90.7" cy="41.2" r="5.1"></circle><path class="cls-1" d="M87,41.2a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,87,41.2Z"></path><circle class="cls-8" cx="84.7" cy="62.6" r="5.1"></circle><path class="cls-1" d="M81,62.6a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,81,62.6Z"></path><line class="cls-3" x1="34.8" y1="62.6" x2="51.1" y2="62.6"></line><circle class="cls-8" cx="33.1" cy="62.6" r="5.1"></circle><path class="cls-1" d="M36.9,62.6a3.8,3.8,0,1,1-3.8-3.8A3.8,3.8,0,0,1,36.9,62.6Z"></path><line class="cls-3" x1="23.7" y1="26.7" x2="94.1" y2="26.7"></line><circle class="cls-9" cx="94.09" cy="26.67" r="5"></circle><path class="cls-1" d="M90.3,26.7a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,90.3,26.7Z"></path><circle class="cls-6" cx="78" cy="33.8" r="3.8"></circle><circle class="cls-6" cx="40" cy="33.8" r="3.8"></circle><circle class="cls-10" cx="23.71" cy="26.71" r="5.1"></circle><path class="cls-1" d="M20,26.7a3.8,3.8,0,1,0,3.8-3.8A3.8,3.8,0,0,0,20,26.7Z"></path></svg>
           </a>
       </div>
diff --git a/src/webui/service/templates/device/detail.html b/src/webui/service/templates/device/detail.html
index 143bbeed70b545f6d1e123efe5f8559a3cc44355..f27ac554b1c975039c2cb481c92debf47ba1591f 100644
--- a/src/webui/service/templates/device/detail.html
+++ b/src/webui/service/templates/device/detail.html
@@ -21,7 +21,7 @@
 
     <div class="row mb-3">
         <div class="col-sm-3">
-            <button type="button" class="btn btn-success" onclick="window.location.href = '/device/'">
+            <button type="button" class="btn btn-success" onclick="window.location.href='{{ url_for('device.home') }}'">
                 <i class="bi bi-box-arrow-in-left"></i>
                 Back to device list
             </button>
diff --git a/src/webui/service/static/site.js b/src/webui/service/templates/js/site.js
similarity index 100%
rename from src/webui/service/static/site.js
rename to src/webui/service/templates/js/site.js
diff --git a/src/webui/service/static/topology.js b/src/webui/service/templates/js/topology.js
similarity index 96%
rename from src/webui/service/static/topology.js
rename to src/webui/service/templates/js/topology.js
index dd58388cd2b7253f328b2ba7f38e007cdcc1007f..05216fb98808d5b574d613344c63a7e19cb2c472 100644
--- a/src/webui/service/static/topology.js
+++ b/src/webui/service/templates/js/topology.js
@@ -51,7 +51,7 @@ forceProperties = {
 var simulation = d3.forceSimulation();
 
 // load the data
-d3.json('/topology', function(data) {
+d3.json("{{ url_for('main.topology') }}", function(data) {
     // set the data and properties of link lines and node circles
     link = svg.append("g").attr("class", "links").style('stroke', '#aaa')
         .selectAll("line")
@@ -63,7 +63,9 @@ d3.json('/topology', function(data) {
         .data(data.devices)
         .enter()
         .append("image")
-        .attr('xlink:href', function(d) {return '/static/topology_icons/' + d.type + '.png';})
+        .attr('xlink:href', function(d) {
+            return "{{ url_for('static', filename='/topology_icons/') }}" + d.type + ".png";
+        })
         .attr('width',  icon_width)
         .attr('height', icon_height)
         .call(d3.drag().on("start", dragstarted).on("drag", dragged).on("end", dragended));
diff --git a/src/webui/service/templates/main/home.html b/src/webui/service/templates/main/home.html
index 2134a3a87abde0d8c6af69dbc136819a4fbbf1c1..3cc9fbcffce6cfbb6ebb40dec9d3359f59df5a15 100644
--- a/src/webui/service/templates/main/home.html
+++ b/src/webui/service/templates/main/home.html
@@ -79,6 +79,6 @@
 
     <script src="https://d3js.org/d3.v4.min.js"></script>
     <div id="topology"></div>
-    <script src="{{ url_for('static', filename='topology.js') }}"></script>
+    <script src="{{ url_for('js.topology_js') }}"></script>
 
 {% endblock %}
diff --git a/src/webui/service/templates/service/detail.html b/src/webui/service/templates/service/detail.html
index 77988c74c1f004fe872961ac50aabe9cede8dc65..b7c210c3f3f9c7e3bf5a9b6311e0503d2e1d40e9 100644
--- a/src/webui/service/templates/service/detail.html
+++ b/src/webui/service/templates/service/detail.html
@@ -21,7 +21,7 @@
 
     <div class="row mb-3">
         <div class="col-sm-3">
-            <button type="button" class="btn btn-success" onclick="window.location.href = '/service/'">
+            <button type="button" class="btn btn-success" onclick="window.location.href='{{ url_for('service.home') }}'">
                 <i class="bi bi-box-arrow-in-left"></i>
                 Back to service list
             </button>