diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/Uuid.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ConfigActionEnum.java
similarity index 81%
rename from src/policy/src/main/java/eu/teraflow/policy/context/model/Uuid.java
rename to src/policy/src/main/java/eu/teraflow/policy/context/model/ConfigActionEnum.java
index 9a429f5acbade01a50efdee4b9e8d36ea1400ae2..6cc8e844182505ed104fae7766c1ea63474c7929 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/Uuid.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ConfigActionEnum.java
@@ -16,15 +16,8 @@
 
 package eu.teraflow.policy.context.model;
 
-public class Uuid {
-
-    private String id;
-
-    public Uuid(String id) {
-        this.id = id;
-    }
-
-    public String getId() {
-        return id;
-    }
+public enum ConfigActionEnum {
+    UNDEFINED,
+    SET,
+    DELETE
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/ConfigRule.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ConfigRule.java
new file mode 100644
index 0000000000000000000000000000000000000000..906acf1a3ff121584321551de6baf260f0bb7cf3
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ConfigRule.java
@@ -0,0 +1,49 @@
+/*
+* 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.context.model;
+
+public class ConfigRule {
+
+    private final ConfigActionEnum action;
+    private final String resourceKey;
+    private final String resourceValue;
+
+    public ConfigRule(ConfigActionEnum action, String resourceKey, String resourceValue) {
+        this.action = action;
+        this.resourceKey = resourceKey;
+        this.resourceValue = resourceValue;
+    }
+
+    public ConfigActionEnum getAction() {
+        return action;
+    }
+
+    public String getResourceKey() {
+        return resourceKey;
+    }
+
+    public String getResourceValue() {
+        return resourceValue;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{action:\"%s\", resourceKey:\"%s\", resourceValue:\"%s\"}",
+                getClass().getSimpleName(), action.toString(), resourceKey, resourceValue);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/Constraint.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/Constraint.java
new file mode 100644
index 0000000000000000000000000000000000000000..edc5c0df7b789f97475d934bacb87b47792d2b01
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/Constraint.java
@@ -0,0 +1,43 @@
+/*
+* 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.context.model;
+
+public class Constraint {
+
+    private final String constraintType;
+    private final String constraintValue;
+
+    public Constraint(String constraintType, String constraintValue) {
+        this.constraintType = constraintType;
+        this.constraintValue = constraintValue;
+    }
+
+    public String getConstraintType() {
+        return constraintType;
+    }
+
+    public String getConstraintValue() {
+        return constraintValue;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{constraintType:\"%s\", constraintValue:\"%s\"}",
+                getClass().getSimpleName(), constraintType, constraintValue);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/EndPointId.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/EndPointId.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9a3cbeb074eb166452b94c8b87db5edd17f346c
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/EndPointId.java
@@ -0,0 +1,49 @@
+/*
+* 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.context.model;
+
+public class EndPointId {
+
+    private final TopologyId topologyId;
+    private final String deviceId;
+    private final String id;
+
+    public EndPointId(TopologyId topologyId, String deviceId, String id) {
+        this.topologyId = topologyId;
+        this.deviceId = deviceId;
+        this.id = id;
+    }
+
+    public TopologyId getTopologyId() {
+        return topologyId;
+    }
+
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{%s, deviceId:\"%s\", id:\"%s\"}",
+                getClass().getSimpleName(), topologyId, deviceId, id);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/Event.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/Event.java
index a9d532e06874b51e9b0283b31f6cdd225b4e4a0b..67da36b5c075134051a56929a39d07579381551a 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/Event.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/Event.java
@@ -33,4 +33,11 @@ public class Event {
     public EventTypeEnum getEventTypeEnum() {
         return eventType;
     }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{timestamp:\"%f\", eventType:\"%s\"}",
+                getClass().getSimpleName(), timestamp, eventType.toString());
+    }
 }
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
new file mode 100644
index 0000000000000000000000000000000000000000..5441a8cb0439ef6342cd805114ebb1aada27cd42
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/Service.java
@@ -0,0 +1,86 @@
+/*
+* 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.context.model;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Service {
+
+    private final ServiceId serviceId;
+    private final ServiceTypeEnum serviceType;
+    private final List<EndPointId> serviceEndPointIds;
+    private final List<Constraint> serviceConstraints;
+    private final ServiceStatus serviceStatus;
+    private final ServiceConfig serviceConfig;
+
+    public Service(
+            ServiceId serviceId,
+            ServiceTypeEnum serviceType,
+            List<EndPointId> serviceEndPointIds,
+            List<Constraint> serviceConstraints,
+            ServiceStatus serviceStatus,
+            ServiceConfig serviceConfig) {
+        this.serviceId = serviceId;
+        this.serviceType = serviceType;
+        this.serviceEndPointIds = serviceEndPointIds;
+        this.serviceConstraints = serviceConstraints;
+        this.serviceStatus = serviceStatus;
+        this.serviceConfig = serviceConfig;
+    }
+
+    public ServiceId getServiceId() {
+        return serviceId;
+    }
+
+    public ServiceTypeEnum getServiceType() {
+        return serviceType;
+    }
+
+    public List<EndPointId> getServiceEndPointIds() {
+        return serviceEndPointIds;
+    }
+
+    public List<Constraint> getServiceConstraints() {
+        return serviceConstraints;
+    }
+
+    public ServiceStatus getServiceStatus() {
+        return serviceStatus;
+    }
+
+    public ServiceConfig getServiceConfig() {
+        return serviceConfig;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{%s, serviceType:\"%s\", [%s], [%s], %s, %s}",
+                getClass().getSimpleName(),
+                serviceId,
+                serviceType.toString(),
+                toString(serviceEndPointIds),
+                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
new file mode 100644
index 0000000000000000000000000000000000000000..22c8b3cb6674d4fa7647babb5e2ef8256bd8bd6c
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceConfig.java
@@ -0,0 +1,43 @@
+/*
+* 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.context.model;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ServiceConfig {
+
+    private final List<ConfigRule> configRules;
+
+    public ServiceConfig(List<ConfigRule> configRules) {
+        this.configRules = configRules;
+    }
+
+    public List<ConfigRule> getConfigRules() {
+        return configRules;
+    }
+
+    @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(", "));
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceId.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceId.java
index e8027d82c843e440384e1018251266330e07b1f2..6229c1de7541dc63e3d9f18706cf33c4b4df57e9 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceId.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceId.java
@@ -18,20 +18,26 @@ package eu.teraflow.policy.context.model;
 
 public class ServiceId {
 
-    private final ContextId contextId;
-    private final Uuid serviceUuid;
+    private final String contextId;
+    private final String id;
 
-    public ServiceId(ContextId contextId, Uuid serviceUuid) {
+    public ServiceId(String contextId, String id) {
 
         this.contextId = contextId;
-        this.serviceUuid = serviceUuid;
+        this.id = id;
     }
 
-    public ContextId getContextId() {
+    public String getContextId() {
         return contextId;
     }
 
-    public Uuid getServiceUuid() {
-        return serviceUuid;
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{contextId:\"%s\", id:\"%s\"}", getClass().getSimpleName(), contextId, id);
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java
similarity index 60%
rename from src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
rename to src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java
index cc95d9e5d6ecd6ff583b68dbed5236eee26e8348..b5466d1f3e3f645584df434d3076fe43f19ed823 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatus.java
@@ -14,19 +14,22 @@
 * limitations under the License.
 */
 
-package eu.teraflow.policy.model;
+package eu.teraflow.policy.context.model;
 
-import eu.teraflow.policy.context.model.Uuid;
+public class ServiceStatus {
 
-public class PolicyRuleId {
+    private final ServiceStatusEnum status;
 
-    private final Uuid policyRuleId;
+    public ServiceStatus(ServiceStatusEnum status) {
+        this.status = status;
+    }
 
-    public PolicyRuleId(Uuid policyRuleId) {
-        this.policyRuleId = policyRuleId;
+    public ServiceStatusEnum getServiceStatus() {
+        return status;
     }
 
-    public Uuid getPolicyRuleId() {
-        return policyRuleId;
+    @Override
+    public String toString() {
+        return String.format("%s:{serviceStatus:\"%s\"}", getClass().getSimpleName(), status);
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/DeviceId.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java
similarity index 76%
rename from src/policy/src/main/java/eu/teraflow/policy/context/model/DeviceId.java
rename to src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java
index 4277bf693ee78de9d15a0c34e2b6e6093a2aedfb..e39e2fa2c8b4e279a355221c0c246e142d38b51e 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/DeviceId.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java
@@ -16,15 +16,9 @@
 
 package eu.teraflow.policy.context.model;
 
-public class DeviceId {
-
-    private final Uuid deviceId;
-
-    public DeviceId(Uuid deviceId) {
-        this.deviceId = deviceId;
-    }
-
-    public Uuid getDeviceId() {
-        return deviceId;
-    }
+public enum ServiceStatusEnum {
+    UNDEFINED,
+    PLANNED,
+    ACTIVE,
+    PENDING_REMOVAL
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/ContextId.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceTypeEnum.java
similarity index 76%
rename from src/policy/src/main/java/eu/teraflow/policy/context/model/ContextId.java
rename to src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceTypeEnum.java
index 47bcf543e15c5235dfdd8be076e9352c85ace892..f13a408f987f6e753e801e2ae804a8db8d951f4d 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/ContextId.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceTypeEnum.java
@@ -16,15 +16,9 @@
 
 package eu.teraflow.policy.context.model;
 
-public class ContextId {
-
-    private final Uuid contextId;
-
-    public ContextId(Uuid contextId) {
-        this.contextId = contextId;
-    }
-
-    public Uuid getContextId() {
-        return contextId;
-    }
+public enum ServiceTypeEnum {
+    UNKNOWN,
+    L3NM,
+    L2NM,
+    TAPI_CONNECTIVITY_SERVICE
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/TopologyId.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/TopologyId.java
new file mode 100644
index 0000000000000000000000000000000000000000..95157ba8c6ec6ed3d91886282ef845f59e9f9d91
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/TopologyId.java
@@ -0,0 +1,43 @@
+/*
+* 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.context.model;
+
+public class TopologyId {
+
+    private final String contextId;
+    private final String id;
+
+    public TopologyId(String contextId, String id) {
+
+        this.contextId = contextId;
+        this.id = id;
+    }
+
+    public String getContextId() {
+        return contextId;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{contextId:\"%s\", id:\"%s\"}", getClass().getSimpleName(), contextId, id);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java b/src/policy/src/main/java/eu/teraflow/policy/kpi_sample_types/model/KpiSampleType.java
similarity index 67%
rename from src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java
rename to src/policy/src/main/java/eu/teraflow/policy/kpi_sample_types/model/KpiSampleType.java
index 9a928c4a22158ec2691acc4486ea9acd21ff28f8..1bedde35212383e42c7fabfe832d4bd4df34e99b 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/kpi_sample_types/model/KpiSampleType.java
@@ -14,17 +14,12 @@
 * limitations under the License.
 */
 
-package eu.teraflow.policy.model;
+package eu.teraflow.policy.kpi_sample_types.model;
 
-public class PolicyRuleValue {
-
-    private final String policyRuleValue;
-
-    public PolicyRuleValue(String policyRuleValue) {
-        this.policyRuleValue = policyRuleValue;
-    }
-
-    public String getPolicyRuleValue() {
-        return policyRuleValue;
-    }
+public enum KpiSampleType {
+    UNKNOWN,
+    PACKETS_TRANSMITTED,
+    PACKETS_RECEIVED,
+    BYTES_TRANSMITTED,
+    BYTES_RECEIVED
 }
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
new file mode 100644
index 0000000000000000000000000000000000000000..4de1743d0178d5f61737a2830b49370068156c8f
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
@@ -0,0 +1,7 @@
+package eu.teraflow.policy.model;
+
+public enum BooleanOperator {
+    POLICYRULE_CONDITION_BOOLEAN_UNDEFINED,
+    POLICYRULE_CONDITION_BOOLEAN_AND,
+    POLICYRULE_CONDITION_BOOLEAN_OR
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..ccd424a02ba771edc215ee92e7bfc0125a5b5c27
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
@@ -0,0 +1,11 @@
+package eu.teraflow.policy.model;
+
+public enum NumericalOperator {
+    POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED,
+    POLICY_RULE_CONDITION_NUMERICAL_EQUAL,
+    POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL,
+    POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN,
+    POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL,
+    POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+    POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
index 20f78eb817aca50fb0d711bee032deec1a43068e..18dbfa73d396770e71f0e1c864e2440f10b28a55 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
@@ -16,40 +16,44 @@
 
 package eu.teraflow.policy.model;
 
-import eu.teraflow.policy.context.model.ContextId;
 import eu.teraflow.policy.context.model.ServiceId;
+import java.util.List;
+import java.util.stream.Collectors;
 
 public class PolicyRule {
 
-    private final PolicyRuleId policyRuleId;
+    private final String policyRuleId;
     private final PolicyRuleType policyRuleType;
-    private final PolicyRulePriority policyRulePriority;
-    private final PolicyRuleEvent policyRuleEvent;
-    private final PolicyRuleCondition policyRuleCondition;
-    private final PolicyRuleAction policyRuleAction;
+    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 ContextId contextId;
+    private final List<String> deviceIds;
 
     public PolicyRule(
-            PolicyRuleId policyRuleId,
+            String policyRuleId,
             PolicyRuleType policyRuleType,
-            PolicyRulePriority policyRulePriority,
-            PolicyRuleEvent policyRuleEvent,
-            PolicyRuleCondition policyRuleCondition,
-            PolicyRuleAction policyRuleAction,
+            int priority,
+            PolicyRuleEvent event,
+            List<PolicyRuleCondition> policyRuleConditions,
+            BooleanOperator booleanOperator,
+            List<PolicyRuleAction> policyRuleActions,
             ServiceId serviceId,
-            ContextId contextId) {
+            List<String> deviceIds) {
         this.policyRuleId = policyRuleId;
         this.policyRuleType = policyRuleType;
-        this.policyRulePriority = policyRulePriority;
-        this.policyRuleEvent = policyRuleEvent;
-        this.policyRuleCondition = policyRuleCondition;
-        this.policyRuleAction = policyRuleAction;
+        this.priority = priority;
+        this.event = event;
+        this.policyRuleConditions = policyRuleConditions;
+        this.booleanOperator = booleanOperator;
+        this.policyRuleActions = policyRuleActions;
         this.serviceId = serviceId;
-        this.contextId = contextId;
+        this.deviceIds = deviceIds;
     }
 
-    public PolicyRuleId getPolicyRuleId() {
+    public String getPolicyRuleId() {
         return policyRuleId;
     }
 
@@ -57,27 +61,51 @@ public class PolicyRule {
         return policyRuleType;
     }
 
-    public PolicyRulePriority getPolicyRulePriority() {
-        return policyRulePriority;
+    public int getPriority() {
+        return priority;
     }
 
-    public PolicyRuleEvent getPolicyRuleEvent() {
-        return policyRuleEvent;
+    public PolicyRuleEvent getEvent() {
+        return event;
     }
 
-    public PolicyRuleCondition getPolicyRuleCondition() {
-        return policyRuleCondition;
+    public List<PolicyRuleCondition> getPolicyRuleConditions() {
+        return policyRuleConditions;
     }
 
-    public PolicyRuleAction getPolicyRuleAction() {
-        return policyRuleAction;
+    public BooleanOperator getBooleanOperator() {
+        return booleanOperator;
+    }
+
+    public List<PolicyRuleAction> getPolicyRuleActions() {
+        return policyRuleActions;
     }
 
     public ServiceId getServiceId() {
         return serviceId;
     }
 
-    public ContextId getContextId() {
-        return contextId;
+    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]}",
+                getClass().getSimpleName(),
+                policyRuleId,
+                policyRuleType.toString(),
+                priority,
+                event,
+                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(", "));
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java
index 8592262aea9b8a82aaef9a348b7e215958414705..baa19cb8d0016895de9d5eccf5bd0e36d9659b61 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java
@@ -16,22 +16,36 @@
 
 package eu.teraflow.policy.model;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class PolicyRuleAction {
 
-    private final PolicyRuleVariable policyRuleVariable;
-    private final PolicyRuleValue policyRuleValue;
+    private final PolicyRuleActionEnum policyRuleActionEnum;
+    private final List<String> parameters;
+
+    public PolicyRuleAction(PolicyRuleActionEnum policyRuleActionEnum, List<String> parameters) {
 
-    public PolicyRuleAction(PolicyRuleVariable policyRuleVariable, PolicyRuleValue policyRuleValue) {
+        this.policyRuleActionEnum = policyRuleActionEnum;
+        this.parameters = parameters;
+    }
+
+    public PolicyRuleActionEnum getPolicyRuleActionEnum() {
+        return policyRuleActionEnum;
+    }
 
-        this.policyRuleVariable = policyRuleVariable;
-        this.policyRuleValue = policyRuleValue;
+    public List<String> getPolicyRuleActionParameters() {
+        return parameters;
     }
 
-    public PolicyRuleVariable getPolicyRuleVariable() {
-        return policyRuleVariable;
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{policyRuleActionEnum:\"%s\", [%s]}",
+                getClass().getSimpleName(), policyRuleActionEnum.toString(), toString(parameters));
     }
 
-    public PolicyRuleValue getPolicyRuleValue() {
-        return policyRuleValue;
+    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/model/PolicyRuleActionEnum.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..317daa02939bfe21c267b758999bae9d20f294af
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
@@ -0,0 +1,8 @@
+package eu.teraflow.policy.model;
+
+public enum PolicyRuleActionEnum {
+    POLICY_RULE_ACTION_NO_ACTION,
+    POLICY_RULE_ACTION_SET_DEVICE_STATUS,
+    POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+    POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java
index 22d65124c44be3ba1b93683c009860a6dc223da4..714cc5582cce4ce3e606851acb2f2f2b62614e29 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java
@@ -16,23 +16,36 @@
 
 package eu.teraflow.policy.model;
 
+import eu.teraflow.policy.monitoring.model.KpiValue;
+
 public class PolicyRuleCondition {
 
-    private final PolicyRuleVariable policyRuleVariable;
-    private final PolicyRuleValue policyRuleValue;
+    private final String kpiId;
+    private final NumericalOperator numericalOperator;
+    private final KpiValue<?> kpiValue;
+
+    public PolicyRuleCondition(String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) {
+        this.kpiId = kpiId;
+        this.numericalOperator = numericalOperator;
+        this.kpiValue = kpiValue;
+    }
 
-    public PolicyRuleCondition(
-            PolicyRuleVariable policyRuleVariable, PolicyRuleValue policyRuleValue) {
+    public String getKpiId() {
+        return kpiId;
+    }
 
-        this.policyRuleVariable = policyRuleVariable;
-        this.policyRuleValue = policyRuleValue;
+    public NumericalOperator getNumericalOperator() {
+        return numericalOperator;
     }
 
-    public PolicyRuleVariable getPolicyRuleVariable() {
-        return policyRuleVariable;
+    public KpiValue getKpiValue() {
+        return kpiValue;
     }
 
-    public PolicyRuleValue getPolicyRuleValue() {
-        return policyRuleValue;
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{kpiId:\"%s\", numericalOperator:\"%s\", %s}",
+                getClass().getSimpleName(), kpiId, numericalOperator.toString(), kpiValue);
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
index 476d1948215f502d7791ca95648e6a2089aa9434..412c6c7183250aae26de75a945bf57164634bc32 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
@@ -29,4 +29,9 @@ public class PolicyRuleEvent {
     public Event getEvent() {
         return event;
     }
+
+    @Override
+    public String toString() {
+        return String.format("%s:{%s}", getClass().getSimpleName(), event);
+    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java
deleted file mode 100644
index c85bb9a3657265ca28e195cf4477c9ce6fd43df2..0000000000000000000000000000000000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java
+++ /dev/null
@@ -1,30 +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 class PolicyRulePriority {
-
-    private final int policyRulePriority;
-
-    public PolicyRulePriority(int policyRulePriority) {
-        this.policyRulePriority = policyRulePriority;
-    }
-
-    public int getPolicyRulePriority() {
-        return policyRulePriority;
-    }
-}
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 43b93403073fcc78a614b721bd4a169894322841..38ee0a73b187420cfdd3f0bd7527d5196d7bad9f 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
@@ -16,23 +16,28 @@
 
 package eu.teraflow.policy.model;
 
-import eu.teraflow.policy.context.model.Uuid;
-
 public class PolicyRuleState {
 
-    private final Uuid policeRuleId;
+    private final String policeRuleId;
     private final RuleState ruleState;
 
-    public PolicyRuleState(Uuid policeRuleId, RuleState ruleState) {
+    public PolicyRuleState(String policeRuleId, RuleState ruleState) {
         this.policeRuleId = policeRuleId;
         this.ruleState = ruleState;
     }
 
-    public Uuid getPolicyRuleId() {
+    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);
+    }
 }
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
index 6becad243c2ab3d0bbe4cdb3a943fc0ab2ad9bd3..321220176adb7a336870b4845d3883e367c12078 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
@@ -17,6 +17,6 @@
 package eu.teraflow.policy.model;
 
 public enum PolicyRuleType {
-    DEVICE,
-    NETWORK
+    POLICYTYPE_DEVICE,
+    POLICYTYPE_NETWORK
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java
deleted file mode 100644
index fa35d270a7cd00ec9772f6d3678d38f67972eea5..0000000000000000000000000000000000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java
+++ /dev/null
@@ -1,30 +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 class PolicyRuleVariable {
-
-    private final String policyRuleVariable;
-
-    public PolicyRuleVariable(String policyRuleVariable) {
-        this.policyRuleVariable = policyRuleVariable;
-    }
-
-    public String getPolicyRuleVariable() {
-        return policyRuleVariable;
-    }
-}
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
new file mode 100644
index 0000000000000000000000000000000000000000..aa2fe96cd4fdd96ea854de03bf7aea794fe4de00
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/BooleanKpiValue.java
@@ -0,0 +1,20 @@
+package eu.teraflow.policy.monitoring.model;
+
+public class BooleanKpiValue implements KpiValue<Boolean> {
+
+    private final boolean value;
+
+    public BooleanKpiValue(boolean value) {
+        this.value = value;
+    }
+
+    @Override
+    public Boolean getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s:{value:\"%b\"}", getClass().getSimpleName(), value);
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..d183c9c756f678a08c12669b27e46797eb745b51
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/FloatKpiValue.java
@@ -0,0 +1,20 @@
+package eu.teraflow.policy.monitoring.model;
+
+public class FloatKpiValue implements KpiValue<Float> {
+
+    private final float value;
+
+    public FloatKpiValue(float value) {
+        this.value = value;
+    }
+
+    @Override
+    public Float getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s:{value:\"%f\"}", getClass().getSimpleName(), value);
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..b7048b188687657d3c6253d71cce32add4b80306
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/IntegerKpiValue.java
@@ -0,0 +1,20 @@
+package eu.teraflow.policy.monitoring.model;
+
+public class IntegerKpiValue implements KpiValue<Integer> {
+
+    private final int value;
+
+    public IntegerKpiValue(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public Integer getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s:{value:\"%d\"}", getClass().getSimpleName(), value);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/Kpi.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/Kpi.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d84c29d4f32cd2605cf2d20a67b0fa41f801ab1
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/Kpi.java
@@ -0,0 +1,49 @@
+/*
+* 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 Kpi {
+
+    private final String kpiId;
+    private final String timestamp;
+    private final String kpiValue;
+
+    public Kpi(String kpiId, String timestamp, String kpiValue) {
+        this.kpiId = kpiId;
+        this.timestamp = timestamp;
+        this.kpiValue = kpiValue;
+    }
+
+    public String getKpiId() {
+        return kpiId;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public String getKpiValue() {
+        return kpiValue;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{kpiId:\"%s\", timeStamp:\"%s\", kpiValue:\"%s\"}",
+                getClass().getSimpleName(), kpiId, timestamp, kpiValue);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiDescriptor.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiDescriptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..85e09ce2e6f7ac297657e59c7868fbbd750675b8
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiDescriptor.java
@@ -0,0 +1,75 @@
+/*
+* 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;
+
+import eu.teraflow.policy.context.model.EndPointId;
+import eu.teraflow.policy.context.model.ServiceId;
+import eu.teraflow.policy.kpi_sample_types.model.KpiSampleType;
+
+public class KpiDescriptor {
+
+    private final String kpiDescription;
+    private final KpiSampleType kpiSampleType;
+    private final String deviceId;
+    private final EndPointId endPointId;
+    private final ServiceId serviceId;
+
+    public KpiDescriptor(
+            String kpiDescription,
+            KpiSampleType kpiSampleType,
+            String deviceId,
+            EndPointId endPointId,
+            ServiceId serviceId) {
+        this.kpiDescription = kpiDescription;
+        this.kpiSampleType = kpiSampleType;
+        this.deviceId = deviceId;
+        this.endPointId = endPointId;
+        this.serviceId = serviceId;
+    }
+
+    public String getKpiDescription() {
+        return kpiDescription;
+    }
+
+    public KpiSampleType getKpiSampleType() {
+        return kpiSampleType;
+    }
+
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    public EndPointId getEndPointId() {
+        return endPointId;
+    }
+
+    public ServiceId getServiceId() {
+        return serviceId;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{kpiDescription:\"%s\", kpiSampleType:\"%s\", deviceId:\"%s\", %s, %s}",
+                getClass().getSimpleName(),
+                kpiDescription,
+                kpiSampleType.toString(),
+                deviceId,
+                endPointId,
+                serviceId);
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..4313c82698086dcf7b755ca522fbc6f952233423
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/KpiValue.java
@@ -0,0 +1,6 @@
+package eu.teraflow.policy.monitoring.model;
+
+public interface KpiValue<T> {
+
+    public T getValue();
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..fade272217208a44f70e0031fbf7c3bc54f1e196
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/StringKpiValue.java
@@ -0,0 +1,20 @@
+package eu.teraflow.policy.monitoring.model;
+
+public class StringKpiValue implements KpiValue<String> {
+
+    private final String value;
+
+    public StringKpiValue(String value) {
+        this.value = value;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s:{value:\"%s\"}", getClass().getSimpleName(), value);
+    }
+}
diff --git a/src/policy/src/main/proto/service.proto b/src/policy/src/main/proto/service.proto
new file mode 120000
index 0000000000000000000000000000000000000000..5ca543da01298ca25912a534f460d4a7183e3a60
--- /dev/null
+++ b/src/policy/src/main/proto/service.proto
@@ -0,0 +1 @@
+../../../../../proto/service.proto
\ No newline at end of file
diff --git a/src/policy/target/generated-sources/grpc/service/MutinyServiceServiceGrpc.java b/src/policy/target/generated-sources/grpc/service/MutinyServiceServiceGrpc.java
new file mode 100644
index 0000000000000000000000000000000000000000..8caa9641d654e5b0f3e07635b366684d8ab5f980
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/service/MutinyServiceServiceGrpc.java
@@ -0,0 +1,168 @@
+package service;
+
+import static service.ServiceServiceGrpc.getServiceDescriptor;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: service.proto")
+public final class MutinyServiceServiceGrpc implements io.quarkus.grpc.runtime.MutinyGrpc {
+    private MutinyServiceServiceGrpc() {}
+
+    public static MutinyServiceServiceStub newMutinyStub(io.grpc.Channel channel) {
+        return new MutinyServiceServiceStub(channel);
+    }
+
+    
+    public static final class MutinyServiceServiceStub extends io.grpc.stub.AbstractStub<MutinyServiceServiceStub> implements io.quarkus.grpc.runtime.MutinyStub {
+        private ServiceServiceGrpc.ServiceServiceStub delegateStub;
+
+        private MutinyServiceServiceStub(io.grpc.Channel channel) {
+            super(channel);
+            delegateStub = ServiceServiceGrpc.newStub(channel);
+        }
+
+        private MutinyServiceServiceStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            super(channel, callOptions);
+            delegateStub = ServiceServiceGrpc.newStub(channel).build(channel, callOptions);
+        }
+
+        @Override
+        protected MutinyServiceServiceStub build(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            return new MutinyServiceServiceStub(channel, callOptions);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> createService(context.ContextOuterClass.Service request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::createService);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> updateService(context.ContextOuterClass.Service request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::updateService);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteService(context.ContextOuterClass.ServiceId request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::deleteService);
+        }
+
+    }
+
+    
+    public static abstract class ServiceServiceImplBase implements io.grpc.BindableService {
+
+        private String compression;
+        /**
+        * Set whether the server will try to use a compressed response.
+        *
+        * @param compression the compression, e.g {@code gzip}
+        */
+        public ServiceServiceImplBase withCompression(String compression) {
+        this.compression = compression;
+        return this;
+        }
+
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> createService(context.ContextOuterClass.Service request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> updateService(context.ContextOuterClass.Service request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteService(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(
+                            service.ServiceServiceGrpc.getCreateServiceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            context.ContextOuterClass.Service,
+                                            context.ContextOuterClass.ServiceId>(
+                                            this, METHODID_CREATE_SERVICE, compression)))
+                    .addMethod(
+                            service.ServiceServiceGrpc.getUpdateServiceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            context.ContextOuterClass.Service,
+                                            context.ContextOuterClass.ServiceId>(
+                                            this, METHODID_UPDATE_SERVICE, compression)))
+                    .addMethod(
+                            service.ServiceServiceGrpc.getDeleteServiceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            context.ContextOuterClass.ServiceId,
+                                            context.ContextOuterClass.Empty>(
+                                            this, METHODID_DELETE_SERVICE, compression)))
+                    .build();
+        }
+    }
+
+    private static final int METHODID_CREATE_SERVICE = 0;
+    private static final int METHODID_UPDATE_SERVICE = 1;
+    private static final int METHODID_DELETE_SERVICE = 2;
+
+    private static final class MethodHandlers<Req, Resp> implements
+            io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+            io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+            io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+            io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+        private final ServiceServiceImplBase serviceImpl;
+        private final int methodId;
+        private final String compression;
+
+        MethodHandlers(ServiceServiceImplBase serviceImpl, int methodId, String compression) {
+            this.serviceImpl = serviceImpl;
+            this.methodId = methodId;
+            this.compression = compression;
+        }
+
+        @java.lang.Override
+        @java.lang.SuppressWarnings("unchecked")
+        public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+            switch (methodId) {
+                case METHODID_CREATE_SERVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.Service) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId>) responseObserver,
+                            compression,
+                            serviceImpl::createService);
+                    break;
+                case METHODID_UPDATE_SERVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.Service) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId>) responseObserver,
+                            compression,
+                            serviceImpl::updateService);
+                    break;
+                case METHODID_DELETE_SERVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.ServiceId) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver,
+                            compression,
+                            serviceImpl::deleteService);
+                    break;
+                default:
+                    throw new java.lang.AssertionError();
+            }
+        }
+
+        @java.lang.Override
+        @java.lang.SuppressWarnings("unchecked")
+        public io.grpc.stub.StreamObserver<Req> invoke(io.grpc.stub.StreamObserver<Resp> responseObserver) {
+            switch (methodId) {
+                default:
+                    throw new java.lang.AssertionError();
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/policy/target/generated-sources/grpc/service/Service.java b/src/policy/target/generated-sources/grpc/service/Service.java
new file mode 100644
index 0000000000000000000000000000000000000000..32393a23714ffd1c1aa69d0909a3ffe7bc876146
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/service/Service.java
@@ -0,0 +1,42 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: service.proto
+
+package service;
+
+public final class Service {
+  private Service() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\rservice.proto\022\007service\032\rcontext.proto2" +
+      "\271\001\n\016ServiceService\0227\n\rCreateService\022\020.co" +
+      "ntext.Service\032\022.context.ServiceId\"\000\0227\n\rU" +
+      "pdateService\022\020.context.Service\032\022.context" +
+      ".ServiceId\"\000\0225\n\rDeleteService\022\022.context." +
+      "ServiceId\032\016.context.Empty\"\000b\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          context.ContextOuterClass.getDescriptor(),
+        });
+    context.ContextOuterClass.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/policy/target/generated-sources/grpc/service/ServiceService.java b/src/policy/target/generated-sources/grpc/service/ServiceService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b51f2353623b201978b84ff8587553a8ef606b51
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/service/ServiceService.java
@@ -0,0 +1,20 @@
+package service;
+
+import io.quarkus.grpc.runtime.MutinyService;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: service.proto")
+public interface ServiceService extends MutinyService {
+
+    
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> createService(context.ContextOuterClass.Service request);
+    
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> updateService(context.ContextOuterClass.Service request);
+    
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteService(context.ContextOuterClass.ServiceId request);
+    
+    
+    
+
+}
\ No newline at end of file
diff --git a/src/policy/target/generated-sources/grpc/service/ServiceServiceBean.java b/src/policy/target/generated-sources/grpc/service/ServiceServiceBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4c34aaa82129ae725d7b2ff7abeff7dc6c159cc
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/service/ServiceServiceBean.java
@@ -0,0 +1,43 @@
+package service;
+
+import io.grpc.BindableService;
+import io.quarkus.grpc.GrpcService;
+import io.quarkus.grpc.runtime.MutinyBean;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: service.proto")
+public class ServiceServiceBean extends MutinyServiceServiceGrpc.ServiceServiceImplBase implements BindableService, MutinyBean {
+
+    private final ServiceService delegate;
+
+    ServiceServiceBean(@GrpcService ServiceService delegate) {
+       this.delegate = delegate;
+    }
+
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> createService(context.ContextOuterClass.Service request) {
+       try {
+         return delegate.createService(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> updateService(context.ContextOuterClass.Service request) {
+       try {
+         return delegate.updateService(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteService(context.ContextOuterClass.ServiceId request) {
+       try {
+         return delegate.deleteService(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+
+}
\ No newline at end of file
diff --git a/src/policy/target/generated-sources/grpc/service/ServiceServiceClient.java b/src/policy/target/generated-sources/grpc/service/ServiceServiceClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..91522d4779a6ee7c85c9589588ea7cc0cba39efc
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/service/ServiceServiceClient.java
@@ -0,0 +1,36 @@
+package service;
+
+import java.util.function.BiFunction;
+
+import io.quarkus.grpc.runtime.MutinyClient;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: service.proto")
+public class ServiceServiceClient implements ServiceService, MutinyClient<MutinyServiceServiceGrpc.MutinyServiceServiceStub> {
+
+    private final MutinyServiceServiceGrpc.MutinyServiceServiceStub stub;
+
+    public ServiceServiceClient(String name, io.grpc.Channel channel, BiFunction<String, MutinyServiceServiceGrpc.MutinyServiceServiceStub, MutinyServiceServiceGrpc.MutinyServiceServiceStub> stubConfigurator) {
+       this.stub = stubConfigurator.apply(name,MutinyServiceServiceGrpc.newMutinyStub(channel));
+    }
+
+    @Override
+    public MutinyServiceServiceGrpc.MutinyServiceServiceStub getStub() {
+       return stub;
+    }
+
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> createService(context.ContextOuterClass.Service request) {
+       return stub.createService(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceId> updateService(context.ContextOuterClass.Service request) {
+       return stub.updateService(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteService(context.ContextOuterClass.ServiceId request) {
+       return stub.deleteService(request);
+    }
+
+}
\ No newline at end of file
diff --git a/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java b/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java
new file mode 100644
index 0000000000000000000000000000000000000000..66419a93bacee7dad02d302044b8024e8ed12154
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java
@@ -0,0 +1,423 @@
+package service;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+
+/**
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.38.1)",
+    comments = "Source: service.proto")
+public final class ServiceServiceGrpc {
+
+  private ServiceServiceGrpc() {}
+
+  public static final String SERVICE_NAME = "service.ServiceService";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.Service,
+      context.ContextOuterClass.ServiceId> getCreateServiceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "CreateService",
+      requestType = context.ContextOuterClass.Service.class,
+      responseType = context.ContextOuterClass.ServiceId.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<context.ContextOuterClass.Service,
+      context.ContextOuterClass.ServiceId> getCreateServiceMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.Service, context.ContextOuterClass.ServiceId> getCreateServiceMethod;
+    if ((getCreateServiceMethod = ServiceServiceGrpc.getCreateServiceMethod) == null) {
+      synchronized (ServiceServiceGrpc.class) {
+        if ((getCreateServiceMethod = ServiceServiceGrpc.getCreateServiceMethod) == null) {
+          ServiceServiceGrpc.getCreateServiceMethod = getCreateServiceMethod =
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.Service, context.ContextOuterClass.ServiceId>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "CreateService"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.Service.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.ServiceId.getDefaultInstance()))
+              .setSchemaDescriptor(new ServiceServiceMethodDescriptorSupplier("CreateService"))
+              .build();
+        }
+      }
+    }
+    return getCreateServiceMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.Service,
+      context.ContextOuterClass.ServiceId> getUpdateServiceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "UpdateService",
+      requestType = context.ContextOuterClass.Service.class,
+      responseType = context.ContextOuterClass.ServiceId.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<context.ContextOuterClass.Service,
+      context.ContextOuterClass.ServiceId> getUpdateServiceMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.Service, context.ContextOuterClass.ServiceId> getUpdateServiceMethod;
+    if ((getUpdateServiceMethod = ServiceServiceGrpc.getUpdateServiceMethod) == null) {
+      synchronized (ServiceServiceGrpc.class) {
+        if ((getUpdateServiceMethod = ServiceServiceGrpc.getUpdateServiceMethod) == null) {
+          ServiceServiceGrpc.getUpdateServiceMethod = getUpdateServiceMethod =
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.Service, context.ContextOuterClass.ServiceId>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "UpdateService"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.Service.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.ServiceId.getDefaultInstance()))
+              .setSchemaDescriptor(new ServiceServiceMethodDescriptorSupplier("UpdateService"))
+              .build();
+        }
+      }
+    }
+    return getUpdateServiceMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId,
+      context.ContextOuterClass.Empty> getDeleteServiceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "DeleteService",
+      requestType = context.ContextOuterClass.ServiceId.class,
+      responseType = context.ContextOuterClass.Empty.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId,
+      context.ContextOuterClass.Empty> getDeleteServiceMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId, context.ContextOuterClass.Empty> getDeleteServiceMethod;
+    if ((getDeleteServiceMethod = ServiceServiceGrpc.getDeleteServiceMethod) == null) {
+      synchronized (ServiceServiceGrpc.class) {
+        if ((getDeleteServiceMethod = ServiceServiceGrpc.getDeleteServiceMethod) == null) {
+          ServiceServiceGrpc.getDeleteServiceMethod = getDeleteServiceMethod =
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.ServiceId, context.ContextOuterClass.Empty>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "DeleteService"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.ServiceId.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.Empty.getDefaultInstance()))
+              .setSchemaDescriptor(new ServiceServiceMethodDescriptorSupplier("DeleteService"))
+              .build();
+        }
+      }
+    }
+    return getDeleteServiceMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static ServiceServiceStub newStub(io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<ServiceServiceStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<ServiceServiceStub>() {
+        @java.lang.Override
+        public ServiceServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new ServiceServiceStub(channel, callOptions);
+        }
+      };
+    return ServiceServiceStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static ServiceServiceBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<ServiceServiceBlockingStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<ServiceServiceBlockingStub>() {
+        @java.lang.Override
+        public ServiceServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new ServiceServiceBlockingStub(channel, callOptions);
+        }
+      };
+    return ServiceServiceBlockingStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static ServiceServiceFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<ServiceServiceFutureStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<ServiceServiceFutureStub>() {
+        @java.lang.Override
+        public ServiceServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new ServiceServiceFutureStub(channel, callOptions);
+        }
+      };
+    return ServiceServiceFutureStub.newStub(factory, channel);
+  }
+
+  /**
+   */
+  public static abstract class ServiceServiceImplBase implements io.grpc.BindableService {
+
+    /**
+     */
+    public void createService(context.ContextOuterClass.Service request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getCreateServiceMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void updateService(context.ContextOuterClass.Service request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getUpdateServiceMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void deleteService(context.ContextOuterClass.ServiceId request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteServiceMethod(), responseObserver);
+    }
+
+    @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+      return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+          .addMethod(
+            getCreateServiceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                context.ContextOuterClass.Service,
+                context.ContextOuterClass.ServiceId>(
+                  this, METHODID_CREATE_SERVICE)))
+          .addMethod(
+            getUpdateServiceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                context.ContextOuterClass.Service,
+                context.ContextOuterClass.ServiceId>(
+                  this, METHODID_UPDATE_SERVICE)))
+          .addMethod(
+            getDeleteServiceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                context.ContextOuterClass.ServiceId,
+                context.ContextOuterClass.Empty>(
+                  this, METHODID_DELETE_SERVICE)))
+          .build();
+    }
+  }
+
+  /**
+   */
+  public static final class ServiceServiceStub extends io.grpc.stub.AbstractAsyncStub<ServiceServiceStub> {
+    private ServiceServiceStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected ServiceServiceStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new ServiceServiceStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public void createService(context.ContextOuterClass.Service request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getCreateServiceMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void updateService(context.ContextOuterClass.Service request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getUpdateServiceMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void deleteService(context.ContextOuterClass.ServiceId request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getDeleteServiceMethod(), getCallOptions()), request, responseObserver);
+    }
+  }
+
+  /**
+   */
+  public static final class ServiceServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub<ServiceServiceBlockingStub> {
+    private ServiceServiceBlockingStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected ServiceServiceBlockingStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new ServiceServiceBlockingStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public context.ContextOuterClass.ServiceId createService(context.ContextOuterClass.Service request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getCreateServiceMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public context.ContextOuterClass.ServiceId updateService(context.ContextOuterClass.Service request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getUpdateServiceMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public context.ContextOuterClass.Empty deleteService(context.ContextOuterClass.ServiceId request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getDeleteServiceMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   */
+  public static final class ServiceServiceFutureStub extends io.grpc.stub.AbstractFutureStub<ServiceServiceFutureStub> {
+    private ServiceServiceFutureStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected ServiceServiceFutureStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new ServiceServiceFutureStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.ServiceId> createService(
+        context.ContextOuterClass.Service request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getCreateServiceMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.ServiceId> updateService(
+        context.ContextOuterClass.Service request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getUpdateServiceMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.Empty> deleteService(
+        context.ContextOuterClass.ServiceId request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getDeleteServiceMethod(), getCallOptions()), request);
+    }
+  }
+
+  private static final int METHODID_CREATE_SERVICE = 0;
+  private static final int METHODID_UPDATE_SERVICE = 1;
+  private static final int METHODID_DELETE_SERVICE = 2;
+
+  private static final class MethodHandlers<Req, Resp> implements
+      io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+    private final ServiceServiceImplBase serviceImpl;
+    private final int methodId;
+
+    MethodHandlers(ServiceServiceImplBase serviceImpl, int methodId) {
+      this.serviceImpl = serviceImpl;
+      this.methodId = methodId;
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        case METHODID_CREATE_SERVICE:
+          serviceImpl.createService((context.ContextOuterClass.Service) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId>) responseObserver);
+          break;
+        case METHODID_UPDATE_SERVICE:
+          serviceImpl.updateService((context.ContextOuterClass.Service) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceId>) responseObserver);
+          break;
+        case METHODID_DELETE_SERVICE:
+          serviceImpl.deleteService((context.ContextOuterClass.ServiceId) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver);
+          break;
+        default:
+          throw new AssertionError();
+      }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver<Req> invoke(
+        io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        default:
+          throw new AssertionError();
+      }
+    }
+  }
+
+  private static abstract class ServiceServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+    ServiceServiceBaseDescriptorSupplier() {}
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+      return service.Service.getDescriptor();
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+      return getFileDescriptor().findServiceByName("ServiceService");
+    }
+  }
+
+  private static final class ServiceServiceFileDescriptorSupplier
+      extends ServiceServiceBaseDescriptorSupplier {
+    ServiceServiceFileDescriptorSupplier() {}
+  }
+
+  private static final class ServiceServiceMethodDescriptorSupplier
+      extends ServiceServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+    private final String methodName;
+
+    ServiceServiceMethodDescriptorSupplier(String methodName) {
+      this.methodName = methodName;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+      return getServiceDescriptor().findMethodByName(methodName);
+    }
+  }
+
+  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+  public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+    io.grpc.ServiceDescriptor result = serviceDescriptor;
+    if (result == null) {
+      synchronized (ServiceServiceGrpc.class) {
+        result = serviceDescriptor;
+        if (result == null) {
+          serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+              .setSchemaDescriptor(new ServiceServiceFileDescriptorSupplier())
+              .addMethod(getCreateServiceMethod())
+              .addMethod(getUpdateServiceMethod())
+              .addMethod(getDeleteServiceMethod())
+              .build();
+        }
+      }
+    }
+    return result;
+  }
+}