diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java
index ac0710d8590153ef8df1e9dbeb6465eac88c3fa1..fcdfffdb64ae68738adca5e417f7e852902c544b 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java
@@ -16,6 +16,8 @@
 
 package eu.teraflow.policy.model;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import eu.teraflow.policy.common.Util;
 import eu.teraflow.policy.context.model.ServiceId;
 import java.util.List;
@@ -28,8 +30,11 @@ public class PolicyRuleService {
 
     public PolicyRuleService(
             PolicyRuleBasic policyRuleBasic, ServiceId serviceId, List<String> deviceIds) {
+        checkNotNull(policyRuleBasic, "PolicyRuleBasic must not be null.");
         this.policyRuleBasic = policyRuleBasic;
+        checkNotNull(serviceId, "Service Id must not be null.");
         this.serviceId = serviceId;
+        checkNotNull(deviceIds, "Device Ids must not be null.");
         this.deviceIds = deviceIds;
     }
 
diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
index 955ad2a62255155bee0ec7f8aa171d91410d8519..907473f80077bd397c5219c9484893e292eae828 100644
--- a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
+++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
@@ -70,7 +70,7 @@ class PolicyRuleBasicValidationTest {
     }
 
     @Test
-    void shouldThrowIllegalArgumentExceptionGivenNullPolicyRuleId() {
+    void shouldThrowNullPointerExceptionGivenNullPolicyRuleId() {
         final var policyRuleConditions =
                 createPolicyRuleConditions(
                         UUID.randomUUID().toString(),
diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b565b7e75b5cf9eb7748d0ba92e4fa3416b3b52e
--- /dev/null
+++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java
@@ -0,0 +1,222 @@
+/*
+* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package eu.teraflow.policy;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+import eu.teraflow.policy.context.model.ServiceId;
+import eu.teraflow.policy.model.BooleanOperator;
+import eu.teraflow.policy.model.NumericalOperator;
+import eu.teraflow.policy.model.PolicyRuleAction;
+import eu.teraflow.policy.model.PolicyRuleActionEnum;
+import eu.teraflow.policy.model.PolicyRuleBasic;
+import eu.teraflow.policy.model.PolicyRuleCondition;
+import eu.teraflow.policy.model.PolicyRuleService;
+import eu.teraflow.policy.model.PolicyRuleState;
+import eu.teraflow.policy.model.RuleState;
+import eu.teraflow.policy.monitoring.model.IntegerKpiValue;
+import eu.teraflow.policy.monitoring.model.KpiValue;
+import io.quarkus.test.junit.QuarkusTest;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+class PolicyRuleServiceValidationTest {
+
+    private List<PolicyRuleCondition> createPolicyRuleConditions(
+            String kpiId, NumericalOperator numericalOperator, KpiValue<?> kpiValue) {
+        final var policyRuleCondition = new PolicyRuleCondition(kpiId, numericalOperator, kpiValue);
+
+        return List.of(policyRuleCondition);
+    }
+
+    private List<PolicyRuleAction> createPolicyRuleActions(
+            PolicyRuleActionEnum policyRuleActionEnum, List<String> parameters) {
+        final var policyRuleAction = new PolicyRuleAction(policyRuleActionEnum, parameters);
+
+        return List.of(policyRuleAction);
+    }
+
+    private PolicyRuleBasic createPolicyRuleBasic(
+            String policyRuleId,
+            int priority,
+            PolicyRuleState policyRuleState,
+            BooleanOperator booleanOperator,
+            List<PolicyRuleCondition> policyRuleConditions,
+            List<PolicyRuleAction> policyRuleActions) {
+
+        return new PolicyRuleBasic(
+                policyRuleId,
+                policyRuleState,
+                priority,
+                policyRuleConditions,
+                booleanOperator,
+                policyRuleActions);
+    }
+
+    private ServiceId createServiceId(String contextId, String id) {
+        return new ServiceId(contextId, id);
+    }
+
+    private List<String> createDeviceIds() {
+        return List.of("deviceIdA", "deviceIdB");
+    }
+
+    private PolicyRuleService createPolicyRuleService(
+            PolicyRuleBasic policyRuleBasic, ServiceId serviceId, List<String> deviceIds) {
+
+        return new PolicyRuleService(policyRuleBasic, serviceId, deviceIds);
+    }
+
+    @Test
+    void shouldThrowNullPointerExceptionGivenNullPolicyRuleBasic() {
+        final var serviceId = createServiceId("CONTEXT_ID", "id");
+        final var deviceIds = createDeviceIds();
+
+        assertThatExceptionOfType(NullPointerException.class)
+                .isThrownBy(() -> createPolicyRuleService(null, serviceId, deviceIds));
+    }
+
+    @Test
+    void shouldThrowNullPointerExceptionGivenNullServiceId() {
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+
+        final var deviceIds = createDeviceIds();
+
+        final var policyRuleBasic =
+                createPolicyRuleBasic(
+                        "policyRuleId1",
+                        3,
+                        policyRuleState,
+                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                        policyRuleConditions,
+                        policyRuleActions);
+
+        assertThatExceptionOfType(NullPointerException.class)
+                .isThrownBy(() -> createPolicyRuleService(policyRuleBasic, null, deviceIds));
+    }
+
+    @Test
+    void shouldThrowNullPointerExceptionGivenNullDeviceIds() {
+        final var serviceId = createServiceId("contextId", "ID");
+
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+
+        final var policyRuleBasic =
+                createPolicyRuleBasic(
+                        "policyRuleId2",
+                        2,
+                        policyRuleState,
+                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND,
+                        policyRuleConditions,
+                        policyRuleActions);
+
+        assertThatExceptionOfType(NullPointerException.class)
+                .isThrownBy(() -> createPolicyRuleService(policyRuleBasic, serviceId, null));
+    }
+
+    @Test
+    void shouldCreatePolicyRuleServiceObjectGivenEmptyDeviceIds() {
+        final var serviceId = createServiceId("contextId", "id");
+        final var deviceIds = Collections.<String>emptyList();
+
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+
+        final var policyRuleBasic =
+                createPolicyRuleBasic(
+                        "policyRuleId",
+                        777,
+                        policyRuleState,
+                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND,
+                        policyRuleConditions,
+                        policyRuleActions);
+
+        final var expectedPolicyRuleService =
+                new PolicyRuleService(policyRuleBasic, serviceId, deviceIds);
+
+        final var policyRuleService = createPolicyRuleService(policyRuleBasic, serviceId, deviceIds);
+
+        assertThat(policyRuleService).usingRecursiveComparison().isEqualTo(expectedPolicyRuleService);
+    }
+
+    @Test
+    void shouldCreatePolicyRuleServiceObject() {
+        final var serviceId = createServiceId("contextId", "id");
+        final var deviceIds = List.of("deviceIdA", "deviceIdB");
+
+        final var policyRuleConditions =
+                createPolicyRuleConditions(
+                        UUID.randomUUID().toString(),
+                        NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN,
+                        new IntegerKpiValue(3));
+        final var policyRuleActions =
+                createPolicyRuleActions(
+                        PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT,
+                        List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
+
+        final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE);
+
+        final var policyRuleBasic =
+                createPolicyRuleBasic(
+                        "policyRuleId",
+                        3,
+                        policyRuleState,
+                        BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR,
+                        policyRuleConditions,
+                        policyRuleActions);
+
+        final var expectedPolicyRuleService =
+                new PolicyRuleService(policyRuleBasic, serviceId, deviceIds);
+
+        final var policyRuleService = createPolicyRuleService(policyRuleBasic, serviceId, deviceIds);
+
+        assertThat(policyRuleService).usingRecursiveComparison().isEqualTo(expectedPolicyRuleService);
+    }
+}
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index 3472446aa9c83c8f742462850cab79a37e0a14f1..360485dcc84c8218dc41dcb275ddc146be63391b 100644
--- a/src/policy/target/kubernetes/kubernetes.yml
+++ b/src/policy/target/kubernetes/kubernetes.yml
@@ -3,20 +3,20 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 8d012ef481feb17b0f599b8cd2367799150706d9
-    app.quarkus.io/build-timestamp: 2022-08-04 - 13:19:34 +0000
+    app.quarkus.io/commit-id: a5550cfa37e56aef1054126dd063b112df66b531
+    app.quarkus.io/build-timestamp: 2022-08-04 - 21:21:19 +0000
   labels:
     app.kubernetes.io/name: policyservice
     app: policyservice
   name: policyservice
 spec:
   ports:
-    - name: http
-      port: 8080
-      targetPort: 8080
     - name: grpc
       port: 6060
       targetPort: 6060
+    - name: http
+      port: 8080
+      targetPort: 8080
   selector:
     app.kubernetes.io/name: policyservice
   type: ClusterIP
@@ -25,8 +25,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 8d012ef481feb17b0f599b8cd2367799150706d9
-    app.quarkus.io/build-timestamp: 2022-08-04 - 13:19:34 +0000
+    app.quarkus.io/commit-id: a5550cfa37e56aef1054126dd063b112df66b531
+    app.quarkus.io/build-timestamp: 2022-08-04 - 21:21:19 +0000
   labels:
     app: policyservice
     app.kubernetes.io/name: policyservice
@@ -39,8 +39,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 8d012ef481feb17b0f599b8cd2367799150706d9
-        app.quarkus.io/build-timestamp: 2022-08-04 - 13:19:34 +0000
+        app.quarkus.io/commit-id: a5550cfa37e56aef1054126dd063b112df66b531
+        app.quarkus.io/build-timestamp: 2022-08-04 - 21:21:19 +0000
       labels:
         app: policyservice
         app.kubernetes.io/name: policyservice
@@ -51,12 +51,12 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: MONITORING_SERVICE_HOST
-              value: monitoringservice
             - name: SERVICE_SERVICE_HOST
               value: serviceservice
             - name: CONTEXT_SERVICE_HOST
               value: contextservice
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
           image: registry.gitlab.com/teraflow-h2020/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe:
@@ -71,12 +71,12 @@ spec:
             timeoutSeconds: 10
           name: policyservice
           ports:
-            - containerPort: 8080
-              name: http
-              protocol: TCP
             - containerPort: 6060
               name: grpc
               protocol: TCP
+            - containerPort: 8080
+              name: http
+              protocol: TCP
           readinessProbe:
             failureThreshold: 3
             httpGet: