diff --git a/proto/policy_action.proto b/proto/policy_action.proto
index 17dd721196c0ed407849aa23099477ea34d39ddd..d547e97790cf2cafe2e4cb9ec8c8b06d8a2e0404 100644
--- a/proto/policy_action.proto
+++ b/proto/policy_action.proto
@@ -26,6 +26,8 @@ enum PolicyRuleActionEnum {
   POLICYRULE_ACTION_SET_DEVICE_STATUS = 1;
   POLICYRULE_ACTION_ADD_SERVICE_CONFIGRULE = 2;
   POLICYRULE_ACTION_ADD_SERVICE_CONSTRAINT = 3;
+  POLICY_RULE_ACTION_CALL_SERVICE_RPC = 4;
+  POLICY_RULE_ACTION_RECALCULATE_PATH = 5;
 }
 
 // Action configuration
@@ -37,4 +39,4 @@ message PolicyRuleActionConfig {
 // message PolicyRuleAction {
 //   PolicyRuleActionEnum action = 1;
 //   repeated string parameters = 2;
-// }
\ No newline at end of file
+// }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java
index 141821958eca02925bdebebdd8a34f46a5844a8a..a1556ffbd715e0065681dcfa6001dd041ff89ef0 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java
@@ -21,6 +21,7 @@ import eu.teraflow.policy.context.model.Device;
 import eu.teraflow.policy.context.model.EndPointId;
 import eu.teraflow.policy.context.model.Service;
 import eu.teraflow.policy.context.model.ServiceId;
+import eu.teraflow.policy.model.PolicyRuleService;
 import io.smallrye.mutiny.Uni;
 import java.util.ArrayList;
 import java.util.List;
@@ -42,73 +43,44 @@ public class PolicyRuleConditionValidator {
         this.contextService = contextService;
     }
 
-    public Uni<Boolean> validateDeviceId(String deviceId) {
-        final var isDeviceIdValid = isDeviceIdValid(deviceId);
-
-        isDeviceIdValid
-                .subscribe()
-                .with(
-                        deviceIdIdBooleanValue -> {
-                            if (Boolean.FALSE.equals(deviceIdIdBooleanValue)) {
-                                LOGGER.errorf(INVALID_MESSAGE, deviceId);
-                            }
-                            LOGGER.infof(VALID_MESSAGE, deviceId);
-                        });
-
-        return isDeviceIdValid;
-    }
-
-    public Uni<Boolean> validateServiceId(ServiceId serviceId) {
-        final var isServiceIdValid = isServiceIdValid(serviceId);
-
-        isServiceIdValid
-                .subscribe()
-                .with(
-                        serviceIdBooleanValue -> {
-                            if (Boolean.FALSE.equals(serviceIdBooleanValue)) {
-                                LOGGER.errorf(INVALID_MESSAGE, serviceId);
-                            }
-                        });
-
-        return isServiceIdValid;
-    }
-
-    public Uni<Boolean> validateUpdatedPolicyRuleId(String updatedPolicyRuleId) {
-        final var isUpdatedPolicyRuleIdValid = isUpdatedPolicyRuleIdValid(updatedPolicyRuleId);
-
-        isUpdatedPolicyRuleIdValid
-                .subscribe()
-                .with(
-                        serviceIdBooleanValue -> {
-                            if (Boolean.FALSE.equals(serviceIdBooleanValue)) {
-                                LOGGER.errorf(INVALID_MESSAGE, updatedPolicyRuleId);
-                            }
-                        });
-
-        return isUpdatedPolicyRuleIdValid;
-    }
-
-    private Uni<Boolean> isDeviceIdValid(String deviceId) {
+    public Uni<Boolean> isDeviceIdValid(String deviceId) {
         return contextService
                 .getDevice(deviceId)
+                .onFailure()
+                .recoverWithItem((Device) null)
                 .onItem()
                 .transform(device -> checkIfDeviceIdExists(device, deviceId));
     }
 
     private boolean checkIfDeviceIdExists(Device device, String deviceId) {
-        final var deviceDeviceId = device.getDeviceId();
+        if (device == null) {
+            return false;
+        }
 
+        final var deviceDeviceId = device.getDeviceId();
         return deviceDeviceId.equals(deviceId);
     }
 
-    private Uni<Boolean> isServiceIdValid(ServiceId serviceId) {
+    public Uni<Boolean> isServiceIdValid(ServiceId serviceId, List<String> deviceIds) {
         return contextService
                 .getService(serviceId)
+                .onFailure()
+                .recoverWithItem((Service) null)
                 .onItem()
-                .transform(service -> checkIfServiceIdExists(service, serviceId));
+                .transform(service -> checkIfServiceIsValid(service, serviceId, deviceIds));
+    }
+
+    private boolean checkIfServiceIsValid(
+            Service service, ServiceId serviceId, List<String> deviceIds) {
+        return (checkIfServiceIdExists(service, serviceId)
+                && checkIfServicesDeviceIdsExist(service, deviceIds));
     }
 
     private boolean checkIfServiceIdExists(Service service, ServiceId serviceId) {
+        if (service == null) {
+            return false;
+        }
+
         final var serviceServiceIdServiceId = service.getServiceId();
         final var serviceServiceIdContextId = serviceServiceIdServiceId.getContextId();
         final var serviceServiceIdId = serviceServiceIdServiceId.getId();
@@ -117,14 +89,11 @@ public class PolicyRuleConditionValidator {
                 && serviceServiceIdId.equals(serviceId.getId());
     }
 
-    public Uni<Boolean> isServicesDeviceIdsValid(ServiceId serviceId, List<String> deviceIds) {
-        return contextService
-                .getService(serviceId)
-                .onItem()
-                .transform(service -> checkIfServicesDeviceIdsExist(service, deviceIds));
-    }
-
     private boolean checkIfServicesDeviceIdsExist(Service service, List<String> deviceIds) {
+        if (deviceIds.isEmpty()) {
+            return true;
+        }
+
         List<String> serviceDeviceIds = new ArrayList<>();
         for (EndPointId serviceEndPointId : service.getServiceEndPointIds()) {
             serviceDeviceIds.add(serviceEndPointId.getDeviceId());
@@ -133,7 +102,7 @@ public class PolicyRuleConditionValidator {
         return deviceIds.containsAll(serviceDeviceIds);
     }
 
-    private Uni<Boolean> isUpdatedPolicyRuleIdValid(String updatedPolicyRuleId) {
+    public Uni<Boolean> isUpdatedPolicyRuleIdValid(String updatedPolicyRuleId) {
         return contextService
                 .getPolicyRule(updatedPolicyRuleId)
                 .onItem()
@@ -146,4 +115,25 @@ public class PolicyRuleConditionValidator {
                 .ifNull()
                 .continueWith(false);
     }
+
+    public Uni<Boolean> isPolicyRuleServiceValid(String updatedPolicyRuleId, ServiceId serviceId) {
+        return contextService
+                .getPolicyRule(updatedPolicyRuleId)
+                .onItem()
+                .ifNotNull()
+                .transform(
+                        policyRule -> {
+                            var policyRuleService =
+                                    (PolicyRuleService) policyRule.getPolicyRuleType().getPolicyRuleType();
+                            if (policyRuleService.getServiceId().getId().equals(serviceId.getId())) {
+                                return true;
+                            }
+                            return false;
+                        })
+                .onItem()
+                .ifNull()
+                .continueWith(false)
+                .onFailure()
+                .recoverWithItem(false);
+    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
index fba43c18a573115d279a251f4806834fdefa2129..8462e0b9d7ec875004cea0a1b2836dc92d3b6f15 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
@@ -44,11 +44,10 @@ import eu.teraflow.policy.monitoring.model.AlarmDescriptor;
 import eu.teraflow.policy.monitoring.model.AlarmResponse;
 import eu.teraflow.policy.monitoring.model.AlarmSubscription;
 import eu.teraflow.policy.monitoring.model.KpiValueRange;
-import eu.teraflow.policy.monitoring.model.MonitorKpiRequest;
 import eu.teraflow.policy.service.ServiceService;
 import io.smallrye.mutiny.Multi;
 import io.smallrye.mutiny.Uni;
-import java.time.Duration;
+import io.smallrye.mutiny.groups.UniJoin;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -56,7 +55,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Random;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
 import org.jboss.logging.Logger;
@@ -71,6 +69,9 @@ public class PolicyServiceImpl implements PolicyService {
     private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3;
     private static final int MONITORING_WINDOW_IN_SECONDS = 5;
     private static final int SAMPLING_RATE_PER_SECOND = 1;
+    // TODO: Find a better way to disregard alarms while reconfiguring path
+    // Temporary solution for not calling the same rpc more than it's needed
+    private static int noAlarms = 0;
 
     private static final PolicyRuleState INSERTED_POLICYRULE_STATE =
             new PolicyRuleState(
@@ -160,94 +161,221 @@ public class PolicyServiceImpl implements PolicyService {
         final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
         if (!policyRuleBasic.areArgumentsValid()) {
             LOGGER.error(policyRuleService.getExeceptionMessage());
-            setPolicyRuleServiceToContext(
-                    policyRuleService,
+            final var policyRuleState =
                     new PolicyRuleState(
-                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage()));
-            return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage());
+            return Uni.createFrom().item(policyRuleState);
         }
 
-        policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE);
-        policyRuleService.setPolicyRuleBasic(policyRuleBasic);
-        final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService);
-        final var policyRule = new PolicyRule(policyRuleTypeService);
+        final var serviceId = policyRuleService.getServiceId();
+        final var deviceIds = policyRuleService.getDeviceIds();
+        final var isServiceValid = policyRuleConditionValidator.isServiceIdValid(serviceId, deviceIds);
+
+        return isServiceValid
+                .onItem()
+                .transform(
+                        isService -> {
+                            if (!isService) {
+                                var policyRuleState =
+                                        new PolicyRuleState(
+                                                PolicyRuleStateEnum.POLICY_FAILED,
+                                                String.format(INVALID_MESSAGE, serviceId));
+
+                                return policyRuleState;
+                            }
 
-        contextService
-                .setPolicyRule(policyRule)
-                .subscribe()
-                .with(id -> validateService(policyRuleService));
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService);
+                            final var policyRule = new PolicyRule(policyRuleTypeService);
+                            final var alarmDescriptorList = createAlarmDescriptorList(policyRule);
+
+                            if (alarmDescriptorList.isEmpty()) {
+                                var policyRuleState =
+                                        new PolicyRuleState(
+                                                PolicyRuleStateEnum.POLICY_FAILED,
+                                                String.format(
+                                                        "Invalid PolicyRuleConditions in PolicyRule with ID: %s",
+                                                        policyRuleBasic.getPolicyRuleId()));
+                                return policyRuleState;
+                            }
+                            contextService.setPolicyRule(policyRule).subscribe().with(x -> {});
+                            setPolicyRuleServiceToContext(policyRuleService, VALIDATED_POLICYRULE_STATE);
+                            noAlarms = 0;
+
+                            // Create an alarmIds list that contains the promised ids returned from setKpiAlarm
+                            List<Uni<String>> alarmIds = new ArrayList<Uni<String>>();
+                            for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
+                                LOGGER.infof("alarmDescriptor:");
+                                LOGGER.infof(alarmDescriptor.toString());
+                                alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor));
+                            }
+
+                            // Transform the alarmIds into promised alarms returned from the
+                            // getAlarmResponseStream
+                            List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>();
+                            for (Uni<String> alarmId : alarmIds) {
+                                alarmResponseStreamList.add(
+                                        alarmId
+                                                .onItem()
+                                                .transformToMulti(
+                                                        id -> {
+                                                            alarmPolicyRuleServiceMap.put(id, policyRuleService);
+
+                                                            // TODO: Create infinite subscription
+                                                            var alarmSubscription = new AlarmSubscription(id, 259200, 5000);
+                                                            return monitoringService.getAlarmResponseStream(alarmSubscription);
+                                                        }));
+                            }
+
+                            // Merge the promised alarms into one stream (Multi Object)
+                            final var multi = Multi.createBy().merging().streams(alarmResponseStreamList);
+                            setPolicyRuleServiceToContext(policyRuleService, PROVISIONED_POLICYRULE_STATE);
+
+                            monitorAlarmResponseForService(multi);
+
+                            // TODO: Resubscribe to the stream, if it has ended
+
+                            // TODO: Redesign evaluation of action
+                            // evaluateAction(policyRule, alarmDescriptorList, multi);
+
+                            return VALIDATED_POLICYRULE_STATE;
+                        });
     }
 
     @Override
-    public Uni<PolicyRuleState> updatePolicyService(PolicyRuleService policyRuleService) {
-        LOGGER.infof("Received %s", policyRuleService);
+    public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) {
+        LOGGER.infof("Received %s", policyRuleDevice);
 
-        if (!policyRuleService.areArgumentsValid()) {
-            LOGGER.error(policyRuleService.getExeceptionMessage());
+        if (!policyRuleDevice.areArgumentsValid()) {
+            LOGGER.error(policyRuleDevice.getExeceptionMessage());
             final var policyRuleState =
                     new PolicyRuleState(
-                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleService.getExeceptionMessage());
+                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleDevice.getExeceptionMessage());
 
             return Uni.createFrom().item(policyRuleState);
         }
 
-        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
+        final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
         if (!policyRuleBasic.areArgumentsValid()) {
-            LOGGER.error(policyRuleService.getExeceptionMessage());
-            setPolicyRuleServiceToContext(
-                    policyRuleService,
+            LOGGER.error(policyRuleDevice.getExeceptionMessage());
+            final var policyRuleState =
                     new PolicyRuleState(
-                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage()));
-            return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage());
+            return Uni.createFrom().item(policyRuleState);
         }
 
-        policyRuleBasic.setPolicyRuleState(UPDATED_POLICYRULE_STATE);
-        policyRuleService.setPolicyRuleBasic(policyRuleBasic);
-        final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService);
-        final var policyRule = new PolicyRule(policyRuleTypeService);
+        final var deviceIds = policyRuleDevice.getDeviceIds();
+        final var areDevicesValid = returnInvalidDeviceIds(deviceIds);
+
+        return areDevicesValid
+                .onItem()
+                .transform(
+                        areDevices -> {
+                            if (areDevices.contains(false)) {
+                                var policyRuleState =
+                                        new PolicyRuleState(
+                                                PolicyRuleStateEnum.POLICY_FAILED,
+                                                String.format(
+                                                        INVALID_MESSAGE,
+                                                        policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId()));
+
+                                return policyRuleState;
+                            }
 
-        contextService
-                .setPolicyRule(policyRule)
-                .subscribe()
-                .with(id -> validateUpdatedPolicyService(policyRuleService));
+                            final var policyRuleTypeDevice = new PolicyRuleTypeDevice(policyRuleDevice);
+                            final var policyRule = new PolicyRule(policyRuleTypeDevice);
+
+                            final var alarmDescriptorList = createAlarmDescriptorList(policyRule);
+                            if (alarmDescriptorList.isEmpty()) {
+                                var policyRuleState =
+                                        new PolicyRuleState(
+                                                PolicyRuleStateEnum.POLICY_FAILED,
+                                                String.format(
+                                                        "Invalid PolicyRuleConditions in PolicyRule with ID: %s",
+                                                        policyRuleBasic.getPolicyRuleId()));
+                                return policyRuleState;
+                            }
+
+                            contextService.setPolicyRule(policyRule).subscribe().with(x -> {});
+                            setPolicyRuleDeviceToContext(policyRuleDevice, VALIDATED_POLICYRULE_STATE);
+                            noAlarms = 0;
+
+                            List<Uni<String>> alarmIds = new ArrayList<Uni<String>>();
+                            for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
+                                LOGGER.infof("alarmDescriptor:");
+                                LOGGER.infof(alarmDescriptor.toString());
+                                alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor));
+                            }
+
+                            // Transform the alarmIds into promised alarms returned from the
+                            // getAlarmResponseStream
+                            List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>();
+                            for (Uni<String> alarmId : alarmIds) {
+                                alarmResponseStreamList.add(
+                                        alarmId
+                                                .onItem()
+                                                .transformToMulti(
+                                                        id -> {
+                                                            alarmPolicyRuleDeviceMap.put(id, policyRuleDevice);
+
+                                                            // TODO: Create infinite subscription
+                                                            var alarmSubscription = new AlarmSubscription(id, 259200, 5000);
+                                                            return monitoringService.getAlarmResponseStream(alarmSubscription);
+                                                        }));
+                            }
+
+                            // Merge the promised alarms into one stream (Multi Object)
+                            final var multi = Multi.createBy().merging().streams(alarmResponseStreamList);
+                            setPolicyRuleDeviceToContext(policyRuleDevice, PROVISIONED_POLICYRULE_STATE);
 
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            monitorAlarmResponseForDevice(multi);
+
+                            // TODO: Resubscribe to the stream, if it has ended
+
+                            // TODO: Redesign evaluation of action
+                            // evaluateAction(policyRule, alarmDescriptorList, multi);
+
+                            return VALIDATED_POLICYRULE_STATE;
+                        });
     }
 
     @Override
-    public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) {
-        LOGGER.infof("Received %s", policyRuleDevice);
+    public Uni<PolicyRuleState> updatePolicyService(PolicyRuleService policyRuleService) {
+        LOGGER.infof("Received %s", policyRuleService);
 
-        if (!policyRuleDevice.areArgumentsValid()) {
-            LOGGER.error(policyRuleDevice.getExeceptionMessage());
+        if (!policyRuleService.areArgumentsValid()) {
+            LOGGER.error(policyRuleService.getExeceptionMessage());
             final var policyRuleState =
                     new PolicyRuleState(
-                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleDevice.getExeceptionMessage());
+                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleService.getExeceptionMessage());
 
             return Uni.createFrom().item(policyRuleState);
         }
 
-        final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
+        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
         if (!policyRuleBasic.areArgumentsValid()) {
-            LOGGER.error(policyRuleDevice.getExeceptionMessage());
-            setPolicyRuleDeviceToContext(
-                    policyRuleDevice,
+            LOGGER.error(policyRuleService.getExeceptionMessage());
+            final var policyRuleState =
                     new PolicyRuleState(
-                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage()));
-            return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage());
+            return Uni.createFrom().item(policyRuleState);
         }
 
-        policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE);
-        policyRuleDevice.setPolicyRuleBasic(policyRuleBasic);
-        final var policyRuleTypeDevice = new PolicyRuleTypeDevice(policyRuleDevice);
-        final var policyRule = new PolicyRule(policyRuleTypeDevice);
+        final var serviceId = policyRuleService.getServiceId();
+        final var policyRuleId = policyRuleBasic.getPolicyRuleId();
+        final var isPolicyRuleServiceValid =
+                policyRuleConditionValidator.isPolicyRuleServiceValid(policyRuleId, serviceId);
+
+        return isPolicyRuleServiceValid
+                .onItem()
+                .transform(
+                        isPolicyRuleService -> {
+                            if (!isPolicyRuleService) {
+                                return new PolicyRuleState(
+                                        PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId));
+                            }
 
-        contextService
-                .setPolicyRule(policyRule)
-                .subscribe()
-                .with(id -> validateDevice(policyRuleDevice));
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            return VALIDATED_POLICYRULE_STATE;
+                        });
     }
 
     @Override
@@ -265,153 +393,154 @@ public class PolicyServiceImpl implements PolicyService {
 
         final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
         if (!policyRuleBasic.areArgumentsValid()) {
-            LOGGER.error(policyRuleDevice.getExeceptionMessage());
-            setPolicyRuleDeviceToContext(
-                    policyRuleDevice,
+            final var policyRuleState =
                     new PolicyRuleState(
-                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage()));
-            return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            PolicyRuleStateEnum.POLICY_FAILED, policyRuleBasic.getExeceptionMessage());
+            return Uni.createFrom().item(policyRuleState);
         }
 
-        policyRuleBasic.setPolicyRuleState(UPDATED_POLICYRULE_STATE);
-        policyRuleDevice.setPolicyRuleBasic(policyRuleBasic);
-        final var policyRuleTypeDevice = new PolicyRuleTypeDevice(policyRuleDevice);
-        final var policyRule = new PolicyRule(policyRuleTypeDevice);
+        final var policyRuleId = policyRuleBasic.getPolicyRuleId();
+        final var isPolicyRuleValid =
+                policyRuleConditionValidator.isUpdatedPolicyRuleIdValid(policyRuleId);
 
-        contextService
-                .setPolicyRule(policyRule)
-                .subscribe()
-                .with(id -> validateUpdatedPolicyDevice(policyRuleDevice));
+        return isPolicyRuleValid
+                .onItem()
+                .transform(
+                        isPolicyRuleService -> {
+                            if (!isPolicyRuleService) {
+                                return new PolicyRuleState(
+                                        PolicyRuleStateEnum.POLICY_FAILED,
+                                        String.format(INVALID_MESSAGE, policyRuleId));
+                            }
 
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+                            return VALIDATED_POLICYRULE_STATE;
+                        });
     }
 
     @Override
     public Uni<PolicyRuleState> deletePolicy(String policyRuleId) {
         LOGGER.infof("Received %s", policyRuleId);
 
-        PolicyRule policyRule = contextService.getPolicyRule(policyRuleId).await().indefinitely();
-
-        final var policyRuleBasic = policyRule.getPolicyRuleType().getPolicyRuleBasic();
-        List<PolicyRuleCondition> policyRuleConditions = policyRuleBasic.getPolicyRuleConditions();
-
-        for (PolicyRuleCondition policy : policyRuleConditions) {
-            var empty = monitoringService.deleteKpi(policy.getKpiId());
-            empty
-                    .subscribe()
-                    .with(emptyMessage -> LOGGER.infof("Kpi [%s] has been deleted.\n", policyRuleId));
-        }
-
-        var empty = contextService.removePolicyRule(policyRuleId);
-        empty
-                .subscribe()
-                .with(emptyMessage -> LOGGER.infof("Policy [%s] has been removed.\n", policyRuleId));
-
-        setPolicyRuleToContext(policyRule, REMOVED_POLICYRULE_STATE);
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+        final var getPolicyRule = contextService.getPolicyRule(policyRuleId);
+
+        return getPolicyRule
+                .onItem()
+                .transform(
+                        policyRule -> {
+                            var policyRuleBasic = policyRule.getPolicyRuleType().getPolicyRuleBasic();
+
+                            policyRule
+                                    .getPolicyRuleType()
+                                    .getPolicyRuleBasic()
+                                    .setPolicyRuleState(REMOVED_POLICYRULE_STATE);
+
+                            contextService
+                                    .setPolicyRule(policyRule)
+                                    .subscribe()
+                                    .with(
+                                            tmp ->
+                                                    LOGGER.infof(
+                                                            "DeletePolicy with id: " + VALID_MESSAGE,
+                                                            policyRuleBasic.getPolicyRuleId()));
+
+                            return policyRuleBasic.getPolicyRuleState();
+                        });
     }
 
-    private void monitorKpi(List<AlarmDescriptor> alarmDescriptorList) {
-
-        for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
-            var monitorKpiRequest =
-                    new MonitorKpiRequest(
-                            alarmDescriptor.getKpiId(), MONITORING_WINDOW_IN_SECONDS, SAMPLING_RATE_PER_SECOND);
-            monitoringService
-                    .monitorKpi(monitorKpiRequest)
-                    .subscribe()
-                    .with(
-                            emptyMessage ->
-                                    LOGGER.infof(
-                                            "Kpi [%s] has started to be monitored.\n", alarmDescriptor.getKpiId()));
+    private Uni<List<Boolean>> returnInvalidDeviceIds(List<String> deviceIds) {
+        UniJoin.Builder<Boolean> builder = Uni.join().builder();
+        for (String deviceId : deviceIds) {
+            final var validatedDeviceId = policyRuleConditionValidator.isDeviceIdValid(deviceId);
+            builder.add(validatedDeviceId);
         }
+        return builder.joinAll().andFailFast();
     }
 
-    private void provisionAlarm(
-            PolicyRule policyRule, List<AlarmDescriptor> alarmDescriptorList, Boolean isService) {
+    private List<AlarmDescriptor> createAlarmDescriptorList(PolicyRule policyRule) {
+        final var policyRuleType = policyRule.getPolicyRuleType();
+        final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType();
 
-        List<AlarmSubscription> alarmSubscriptionList = new ArrayList<>();
+        List<AlarmDescriptor> alarmDescriptorList = new ArrayList<>();
+        if (policyRuleTypeSpecificType instanceof PolicyRuleService) {
+            final var policyRuleService = (PolicyRuleService) policyRuleTypeSpecificType;
+            final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
 
-        for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
-            monitoringService
-                    .setKpiAlarm(alarmDescriptor)
-                    .subscribe()
-                    .with(alarmId -> alarmSubscriptionList.add(new AlarmSubscription(alarmId, 0, 0)));
-        }
+            alarmDescriptorList = parsePolicyRuleCondition(policyRuleBasic);
+            if (alarmDescriptorList.isEmpty()) {
+                return List.of();
+            }
+        } else {
+            final var policyRuleDevice = (PolicyRuleDevice) policyRuleTypeSpecificType;
+            final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
 
-        setPolicyRuleToContext(policyRule, PROVISIONED_POLICYRULE_STATE);
+            alarmDescriptorList = parsePolicyRuleCondition(policyRuleBasic);
+            if (alarmDescriptorList.isEmpty()) {
+                return List.of();
+            }
+            for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
+                alarmPolicyRuleDeviceMap.put(alarmDescriptor.getAlarmId(), policyRuleDevice);
+            }
+        }
 
-        getAlarmResponseStream(policyRule, alarmDescriptorList, alarmSubscriptionList, isService);
+        return alarmDescriptorList;
     }
 
-    private void getAlarmResponseStream(
-            PolicyRule policyRule,
-            List<AlarmDescriptor> alarmDescriptorList,
-            List<AlarmSubscription> alarmSubscriptionList,
-            Boolean isService) {
-
-        List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>();
-        for (AlarmSubscription alarmSubscription : alarmSubscriptionList) {
-            alarmResponseStreamList.add(monitoringService.getAlarmResponseStream(alarmSubscription));
-        }
-        Multi<AlarmResponse> multi = Multi.createBy().merging().streams(alarmResponseStreamList);
-
+    private void monitorAlarmResponseForService(Multi<AlarmResponse> multi) {
         multi
-                .select()
-                .first()
                 .subscribe()
                 .with(
                         alarmResponse -> {
+                            LOGGER.infof("**************************Received Alarm!**************************");
+                            LOGGER.infof("alarmResponse:");
                             LOGGER.info(alarmResponse);
-                            if (isService) {
-                                if (!alarmPolicyRuleServiceMap.containsKey(alarmResponse.getAlarmId())) {
-                                    return;
-                                }
-                                applyActionService(alarmResponse.getAlarmId());
-                            } else {
-                                if (!alarmPolicyRuleDeviceMap.containsKey(alarmResponse.getAlarmId())) {
-                                    return;
-                                }
-                                applyActionDevice(alarmResponse.getAlarmId());
-                            }
+                            LOGGER.info(alarmResponse.getAlarmId());
+                            applyActionService(alarmResponse.getAlarmId());
                         });
+    }
 
-        Long count =
-                multi
-                        .collect()
-                        .with(Collectors.counting())
-                        .await()
-                        .atMost(Duration.ofMinutes(POLICY_EVALUATION_TIMEOUT));
-
-        if (count > ACCEPTABLE_NUMBER_OF_ALARMS) {
-            for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
-                monitoringService
-                        .deleteAlarm(alarmDescriptor.getAlarmId())
-                        .subscribe()
-                        .with(
-                                emptyMessage ->
-                                        LOGGER.infof("Alarm [%s] has been deleted.\n", alarmDescriptor.getAlarmId()));
-            }
-
-            setPolicyRuleToContext(policyRule, INEFFECTIVE_POLICYRULE_STATE);
-
-        } else {
-            setPolicyRuleToContext(policyRule, EFFECTIVE_POLICYRULE_STATE);
-
-            multi
-                    .subscribe()
-                    .with(
-                            alarmResponse -> {
-                                LOGGER.info(alarmResponse);
-                                if (isService) {
-                                    applyActionService(alarmResponse.getAlarmId());
-                                } else {
-                                    applyActionDevice(alarmResponse.getAlarmId());
-                                }
-                            });
-        }
+    private void monitorAlarmResponseForDevice(Multi<AlarmResponse> multi) {
+        multi
+                .subscribe()
+                .with(
+                        alarmResponse -> {
+                            LOGGER.infof("**************************Received Alarm!**************************");
+                            LOGGER.infof("alarmResponse:");
+                            LOGGER.info(alarmResponse);
+                            LOGGER.info(alarmResponse.getAlarmId());
+                            applyActionDevice(alarmResponse.getAlarmId());
+                        });
     }
 
+    // TODO: To be refactored or deprecated
+    //    private void evaluateAction(
+    //            PolicyRule policyRule,
+    //            List<AlarmDescriptor> alarmDescriptorList,
+    //            Multi<AlarmResponse> multi) {
+    //
+    //        Long count =
+    //                multi
+    //                        .collect()
+    //                        .with(Collectors.counting())
+    //                        .await()
+    //                        .atMost(Duration.ofMinutes(POLICY_EVALUATION_TIMEOUT));
+    //
+    //        if (count > ACCEPTABLE_NUMBER_OF_ALARMS) {
+    //            for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
+    //                monitoringService
+    //                        .deleteAlarm(alarmDescriptor.getAlarmId())
+    //                        .subscribe()
+    //                        .with(
+    //                                emptyMessage ->
+    //                                        LOGGER.infof(
+    //                                                "Alarm [%s] has been deleted as ineffective.\n",
+    //                                                alarmDescriptor.getAlarmId()));
+    //            }
+    //            setPolicyRuleToContext(policyRule, INEFFECTIVE_POLICYRULE_STATE);
+    //        } else {
+    //            setPolicyRuleToContext(policyRule, EFFECTIVE_POLICYRULE_STATE);
+    //        }
+    //    }
+
     private void applyActionDevice(String alarmId) {
         PolicyRuleDevice policyRuleDevice = alarmPolicyRuleDeviceMap.get(alarmId);
 
@@ -526,190 +655,52 @@ public class PolicyServiceImpl implements PolicyService {
                         });
     }
 
-    private void applyActionService(String alarmId) {
-        PolicyRuleService policyRuleService = alarmPolicyRuleServiceMap.get(alarmId);
-        PolicyRuleAction policyRuleAction = policyRuleActionMap.get(alarmId);
-
-        setPolicyRuleServiceToContext(policyRuleService, ACTIVE_POLICYRULE_STATE);
-
-        switch (policyRuleAction.getPolicyRuleActionEnum()) {
-            case POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT:
-                addServiceConstraint(policyRuleService, policyRuleAction);
-            case POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE:
-                addServiceConfigRule(policyRuleService, policyRuleAction);
-            default:
-                LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum());
-                return;
-        }
-    }
-
-    private void validateDevice(PolicyRuleDevice policyRuleDevice) {
-        final var deviceIds = policyRuleDevice.getDeviceIds();
-        final var policyRuleId = policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId();
-
-        final var invalidDeviceIds = returnInvalidDeviceIds(deviceIds);
-        if (!invalidDeviceIds.isEmpty()) {
-            String ids = "";
-            for (String id : invalidDeviceIds) {
-                ids += " ," + id;
-            }
-
-            String message =
-                    String.format(
-                            "The following devices in PolicyRuleDevice with ID: %s are not valid: %s",
-                            policyRuleId, ids);
-            setPolicyRuleDeviceToContext(
-                    policyRuleDevice, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-            return;
-        }
-
-        createAlarmDescriptorsForDevices(policyRuleDevice);
-    }
-
-    private void createAlarmDescriptorsForDevices(PolicyRuleDevice policyRuleDevice) {
-        final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
-
-        List<AlarmDescriptor> alarmDescriptorList =
-                parsePolicyRuleCondition(policyRuleDevice.getPolicyRuleBasic());
-
-        if (alarmDescriptorList.isEmpty()) {
-            String message =
-                    String.format(
-                            "The devices of PolicyRuleDevice with ID: %s are not valid",
-                            policyRuleBasic.getPolicyRuleId());
-            setPolicyRuleDeviceToContext(
-                    policyRuleDevice, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-            return;
-        }
-
-        setPolicyRuleDeviceToContext(policyRuleDevice, VALIDATED_POLICYRULE_STATE);
-        for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
-            alarmPolicyRuleDeviceMap.put(alarmDescriptor.getAlarmId(), policyRuleDevice);
-        }
-
-        final var policyRuleTypeService = new PolicyRuleTypeDevice(policyRuleDevice);
-        final var policyRule = new PolicyRule(policyRuleTypeService);
-        monitorKpi(alarmDescriptorList);
-        provisionAlarm(policyRule, alarmDescriptorList, false);
-        return;
-    }
-
-    private void validateUpdatedPolicyService(PolicyRuleService policyRuleService) {
-
-        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
-        final var isUpdatedPolicyRuleValid =
-                policyRuleConditionValidator.validateUpdatedPolicyRuleId(policyRuleBasic.getPolicyRuleId());
-
-        isUpdatedPolicyRuleValid
-                .subscribe()
-                .with(
-                        policyRuleBoolean -> {
-                            if (Boolean.FALSE.equals(policyRuleBoolean)) {
-
-                                String message =
-                                        String.format(
-                                                "The PolicyRule with ID: %s was not found. PolicyUpdateService failed.",
-                                                policyRuleBasic.getPolicyRuleId());
-                                setPolicyRuleServiceToContext(
-                                        policyRuleService,
-                                        new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-                                return;
-                            }
-
-                            validateService(policyRuleService);
-                        });
-    }
-
-    private void validateUpdatedPolicyDevice(PolicyRuleDevice policyRuleDevice) {
+    private void callRecalculatePathRPC(
+            PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) {
 
-        final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
-        final var isUpdatedPolicyRuleValid =
-                policyRuleConditionValidator.validateUpdatedPolicyRuleId(policyRuleBasic.getPolicyRuleId());
+        final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId());
 
-        isUpdatedPolicyRuleValid
+        deserializedServiceUni
                 .subscribe()
                 .with(
-                        policyRuleBoolean -> {
-                            if (Boolean.FALSE.equals(policyRuleBoolean)) {
-                                String message =
-                                        String.format(
-                                                "PolicyRule with ID: %s was not found. PolicyUpdateDevice failed",
-                                                policyRuleBasic.getPolicyRuleId());
-                                setPolicyRuleDeviceToContext(
-                                        policyRuleDevice,
-                                        new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-                                return;
-                            }
-                            validateDevice(policyRuleDevice);
+                        deserializedService -> {
+                            serviceService
+                                    .recomputeConnections(deserializedService)
+                                    .subscribe()
+                                    .with(
+                                            x -> {
+                                                LOGGER.info("called recomputeConnections with:");
+                                                LOGGER.info(deserializedService);
+                                                setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE);
+                                            });
                         });
     }
 
-    private void validateService(PolicyRuleService policyRuleService) {
-        final var serviceId = policyRuleService.getServiceId();
-        final var deviceIds = policyRuleService.getDeviceIds();
-        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
-
-        Boolean isServiceIdValid =
-                policyRuleConditionValidator.validateServiceId(serviceId).await().indefinitely();
-
-        if (!isServiceIdValid) {
-            String message =
-                    String.format(
-                            "Cannot provision/update a PolicyRule with invalid service ID: %s",
-                            policyRuleBasic.getPolicyRuleId());
-            setPolicyRuleServiceToContext(
-                    policyRuleService, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-            return;
-        }
-
-        Boolean isServicesDeviceIdsValid =
-                policyRuleConditionValidator
-                        .isServicesDeviceIdsValid(serviceId, deviceIds)
-                        .await()
-                        .indefinitely();
-
-        if (!isServicesDeviceIdsValid) {
-
-            String message =
-                    String.format(
-                            "Cannot provision/update a PolicyRule with invalid service ID: %s",
-                            policyRuleBasic.getPolicyRuleId());
-            setPolicyRuleServiceToContext(
-                    policyRuleService, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-            return;
-        }
-
-        setPolicyRuleServiceToContext(policyRuleService, VALIDATED_POLICYRULE_STATE);
-
-        createAlarmDescriptorsForService(policyRuleService);
-    }
-
-    private void createAlarmDescriptorsForService(PolicyRuleService policyRuleService) {
-        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
-
-        List<AlarmDescriptor> alarmDescriptorList =
-                parsePolicyRuleCondition(policyRuleService.getPolicyRuleBasic());
-
-        if (alarmDescriptorList.isEmpty()) {
-            String message =
-                    String.format(
-                            "Invalid PolicyRuleConditions in PolicyRule with ID: %s",
-                            policyRuleBasic.getPolicyRuleId());
-            setPolicyRuleServiceToContext(
-                    policyRuleService, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message));
-            return;
-        }
-
-        setPolicyRuleServiceToContext(policyRuleService, VALIDATED_POLICYRULE_STATE);
-
-        for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) {
-            alarmPolicyRuleServiceMap.put(alarmDescriptor.getAlarmId(), policyRuleService);
+    private void applyActionService(String alarmId) {
+        PolicyRuleService policyRuleService = alarmPolicyRuleServiceMap.get(alarmId);
+        PolicyRuleAction policyRuleAction =
+                policyRuleService.getPolicyRuleBasic().getPolicyRuleActions().get(0);
+
+        if (noAlarms == 0) {
+            noAlarms++;
+            setPolicyRuleServiceToContext(policyRuleService, ACTIVE_POLICYRULE_STATE);
+
+            switch (policyRuleAction.getPolicyRuleActionEnum()) {
+                case POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT:
+                    addServiceConstraint(policyRuleService, policyRuleAction);
+                case POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE:
+                    addServiceConfigRule(policyRuleService, policyRuleAction);
+                case POLICY_RULE_ACTION_RECALCULATE_PATH:
+                    callRecalculatePathRPC(policyRuleService, policyRuleAction);
+                default:
+                    LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum());
+                    return;
+            }
+        } else if (noAlarms == 2) {
+            noAlarms = 0;
+        } else {
+            noAlarms++;
         }
-
-        final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService);
-        final var policyRule = new PolicyRule(policyRuleTypeService);
-        provisionAlarm(policyRule, alarmDescriptorList, true);
-        return;
     }
 
     private List<AlarmDescriptor> parsePolicyRuleCondition(PolicyRuleBasic policyRuleBasic) {
@@ -833,16 +824,16 @@ public class PolicyServiceImpl implements PolicyService {
                         false);
 
             case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN:
-                return new KpiValueRange(policyRuleCondition.getKpiValue(), null, false, false, false);
+                return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, false, false);
 
             case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL:
-                return new KpiValueRange(policyRuleCondition.getKpiValue(), null, false, true, false);
+                return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, true, false);
 
             case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN:
-                return new KpiValueRange(null, policyRuleCondition.getKpiValue(), false, false, false);
+                return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, false);
 
             case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL:
-                return new KpiValueRange(null, policyRuleCondition.getKpiValue(), false, false, true);
+                return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, true);
             default:
                 return null;
         }
@@ -885,31 +876,6 @@ public class PolicyServiceImpl implements PolicyService {
         return new KpiValueRange(kpiMinValue, kpiMaxValue, true, includeMinValue, includeMaxValue);
     }
 
-    private List<String> returnInvalidDeviceIds(List<String> deviceIds) {
-        var invalidDeviceIds = new ArrayList<String>();
-
-        if (!deviceIds.isEmpty()) {
-
-            for (String deviceId : deviceIds) {
-                final var validatedDeviceId = policyRuleConditionValidator.validateDeviceId(deviceId);
-
-                validatedDeviceId
-                        .subscribe()
-                        .with(
-                                deviceIdBoolean -> {
-                                    if (Boolean.FALSE.equals(deviceIdBoolean)) {
-                                        invalidDeviceIds.add(deviceId);
-                                    }
-                                });
-            }
-
-        } else {
-            LOGGER.warnf("No deviceIds found");
-        }
-
-        return invalidDeviceIds;
-    }
-
     private void setPolicyRuleToContext(PolicyRule policyRule, PolicyRuleState policyRuleState) {
         final var policyRuleType = policyRule.getPolicyRuleType();
         final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType();
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java
index 0a9115acd7cec634d1a4cf6dd096bf44adab141e..353b78eba1ad261d6c65561d1fe3e4f64a914420 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/ServiceStatusEnum.java
@@ -20,5 +20,7 @@ public enum ServiceStatusEnum {
     UNDEFINED,
     PLANNED,
     ACTIVE,
-    PENDING_REMOVAL
+    PENDING_REMOVAL,
+    SLA_VIOLATED,
+    UPDATING
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
index 432c3834c1c2f3417540bb4e62d43a1dfc58a167..971dfbaf29bba86ce0043e2edc6bb1e21f181643 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
@@ -20,5 +20,8 @@ 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
+    POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT,
+    POLICY_RULE_ACTION_CALL_SERVICE_RPC,
+    // This is temporary
+    POLICY_RULE_ACTION_RECALCULATE_PATH
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/AlarmSubscription.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/AlarmSubscription.java
index 532eed60868dfbd5fe1996c781964d3d49a368af..7b99c20456987b6c56a0af00821fb5ef33954ada 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/AlarmSubscription.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/model/AlarmSubscription.java
@@ -22,6 +22,7 @@ public class AlarmSubscription {
     private final float subscriptionTimeoutS;
     private final float subscriptionFrequencyMs;
 
+    // TODO: Refactor the AlarmSubscription constructor to allow infinite subscriptionTimeoutS
     public AlarmSubscription(
             String alarmId, float subscriptionTimeoutS, float subscriptionFrequencyMs) {
         this.alarmId = alarmId;
diff --git a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGateway.java b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGateway.java
index a7483f4f62ac798932ea64a3351536ffb4e5155d..b8764efe312bae8b395beb3a22b1d2a57346b37d 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGateway.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGateway.java
@@ -16,6 +16,7 @@
 
 package eu.teraflow.policy.service;
 
+import eu.teraflow.policy.context.model.Empty;
 import eu.teraflow.policy.context.model.Service;
 import eu.teraflow.policy.context.model.ServiceId;
 import io.smallrye.mutiny.Uni;
@@ -23,4 +24,6 @@ import io.smallrye.mutiny.Uni;
 public interface ServiceGateway {
 
     Uni<ServiceId> updateService(Service service);
+
+    Uni<Empty> recomputeConnections(Service service);
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGatewayImpl.java b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGatewayImpl.java
index d59330fd2b756749c333e70547989bb443bd19d8..f8f38f7520f608b52f432e41b96e46448234a68e 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGatewayImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceGatewayImpl.java
@@ -17,16 +17,19 @@
 package eu.teraflow.policy.service;
 
 import eu.teraflow.policy.Serializer;
+import eu.teraflow.policy.context.model.Empty;
 import eu.teraflow.policy.context.model.Service;
 import eu.teraflow.policy.context.model.ServiceId;
 import io.quarkus.grpc.GrpcClient;
 import io.smallrye.mutiny.Uni;
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
+import org.jboss.logging.Logger;
 import service.MutinyServiceServiceGrpc.MutinyServiceServiceStub;
 
 @ApplicationScoped
 public class ServiceGatewayImpl implements ServiceGateway {
+    private static final Logger LOGGER = Logger.getLogger(ServiceGatewayImpl.class);
 
     @GrpcClient("service")
     MutinyServiceServiceStub streamingDelegateService;
@@ -47,4 +50,23 @@ public class ServiceGatewayImpl implements ServiceGateway {
                 .onItem()
                 .transform(serializer::deserialize);
     }
+
+    @Override
+    public Uni<Empty> recomputeConnections(Service service) {
+        service.getServiceEndPointIds().clear();
+        service.getServiceConstraints().clear();
+        final var serializedService = serializer.serialize(service);
+        LOGGER.info(serializedService);
+
+        return streamingDelegateService
+                .recomputeConnections(serializedService)
+                .onItem()
+                .transform(serializer::deserializeEmpty)
+                .onFailure()
+                .invoke(
+                        x -> {
+                            LOGGER.info("recomputeConnections failed with:");
+                            LOGGER.info(x);
+                        });
+    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceService.java b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceService.java
index bbf91aff0c7ffeeb3f262fa3cebd582acda74502..aa4411ee9d79ea56c3d6f5b901f92b0125fe4b00 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceService.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceService.java
@@ -16,6 +16,7 @@
 
 package eu.teraflow.policy.service;
 
+import eu.teraflow.policy.context.model.Empty;
 import eu.teraflow.policy.context.model.Service;
 import eu.teraflow.policy.context.model.ServiceId;
 import io.smallrye.mutiny.Uni;
@@ -23,4 +24,6 @@ import io.smallrye.mutiny.Uni;
 public interface ServiceService {
 
     Uni<ServiceId> updateService(Service service);
+
+    Uni<Empty> recomputeConnections(Service service);
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceServiceImpl.java b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceServiceImpl.java
index 74728924f70070e7651ac1af4ad75aba8b325c0e..109bcba261d4464313d5b6f21ee2bdde76b17879 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/service/ServiceServiceImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/service/ServiceServiceImpl.java
@@ -16,6 +16,7 @@
 
 package eu.teraflow.policy.service;
 
+import eu.teraflow.policy.context.model.Empty;
 import eu.teraflow.policy.context.model.Service;
 import eu.teraflow.policy.context.model.ServiceId;
 import io.smallrye.mutiny.Uni;
@@ -36,4 +37,9 @@ public class ServiceServiceImpl implements ServiceService {
     public Uni<ServiceId> updateService(Service service) {
         return serviceGateway.updateService(service);
     }
+
+    @Override
+    public Uni<Empty> recomputeConnections(Service service) {
+        return serviceGateway.recomputeConnections(service);
+    }
 }
diff --git a/src/policy/src/test/java/eu/teraflow/policy/SerializerTest.java b/src/policy/src/test/java/eu/teraflow/policy/SerializerTest.java
index f06c30204b874cd6be30cd1a906c5087412e9640..31823e3f6a4b101a8e4deab967723b61a4dd0e97 100644
--- a/src/policy/src/test/java/eu/teraflow/policy/SerializerTest.java
+++ b/src/policy/src/test/java/eu/teraflow/policy/SerializerTest.java
@@ -1914,8 +1914,7 @@ class SerializerTest {
                         ServiceStatusEnum.SLA_VIOLATED,
                         ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_SLA_VIOLATED),
                 Arguments.of(
-                        ServiceStatusEnum.UPDATING,
-                        ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UPDATING),
+                        ServiceStatusEnum.UPDATING, ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UPDATING),
                 Arguments.of(
                         ServiceStatusEnum.UNDEFINED,
                         ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED));