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/PolicyRuleId.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
deleted file mode 100644
index cc95d9e5d6ecd6ff583b68dbed5236eee26e8348..0000000000000000000000000000000000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
+++ /dev/null
@@ -1,32 +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;
-
-import eu.teraflow.policy.context.model.Uuid;
-
-public class PolicyRuleId {
-
-    private final Uuid policyRuleId;
-
-    public PolicyRuleId(Uuid policyRuleId) {
-        this.policyRuleId = policyRuleId;
-    }
-
-    public Uuid getPolicyRuleId() {
-        return policyRuleId;
-    }
-}
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/PolicyRuleValue.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java
deleted file mode 100644
index 9a928c4a22158ec2691acc4486ea9acd21ff28f8..0000000000000000000000000000000000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.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 PolicyRuleValue {
-
-    private final String policyRuleValue;
-
-    public PolicyRuleValue(String policyRuleValue) {
-        this.policyRuleValue = policyRuleValue;
-    }
-
-    public String getPolicyRuleValue() {
-        return policyRuleValue;
-    }
-}
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;
-    }
-}