diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
index d95f3a7be3d59db80edd0a3f2fb4d1720eb9be2e..fbcdbfa5340f9df3943c7fe21db74b855c194a16 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
@@ -52,24 +52,23 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
-    public Uni<PolicyRuleState> policyAddDevice(PolicyRuleDevice request) {
-        final var policyRuleDevice = serializer.deserialize(request);
+    public Uni<PolicyRuleState> policyUpdateService(PolicyRuleService request) {
+        final var policyRuleService = serializer.deserialize(request);
 
         return policyService
-                .addPolicyDevice(policyRuleDevice)
+                .updatePolicyService(policyRuleService)
                 .onItem()
                 .transform(serializer::serialize);
     }
 
     @Override
-    public Uni<PolicyRuleState> policyUpdateService(PolicyRuleService request) {
-        return Uni.createFrom()
-                .item(
-                        () ->
-                                Policy.PolicyRuleState.newBuilder()
-                                        .setPolicyRuleState(
-                                                request.getPolicyRuleBasic().getPolicyRuleState().getPolicyRuleState())
-                                        .build());
+    public Uni<PolicyRuleState> policyAddDevice(PolicyRuleDevice request) {
+        final var policyRuleDevice = serializer.deserialize(request);
+
+        return policyService
+                .addPolicyDevice(policyRuleDevice)
+                .onItem()
+                .transform(serializer::serialize);
     }
 
     @Override
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 0ca242dbbb860354219c4c85bb367563672572ef..3af4f3a8dea133999451b3c39bb5e57f04670078 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java
@@ -70,6 +70,21 @@ public class PolicyRuleConditionValidator {
         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) {
         return contextService
                 .getDevice(deviceId)
@@ -98,4 +113,18 @@ public class PolicyRuleConditionValidator {
         return serviceServiceIdContextId.equals(serviceId.getContextId())
                 && serviceServiceIdId.equals(serviceId.getId());
     }
+
+    private Uni<Boolean> isUpdatedPolicyRuleIdValid(String updatedPolicyRuleId) {
+        return contextService
+                .getPolicyRule(updatedPolicyRuleId)
+                .onItem()
+                .ifNotNull()
+                .transform(
+                        id -> {
+                            return true;
+                        })
+                .onItem()
+                .ifNull()
+                .continueWith(false);
+    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java
index dcaf43b902c95471cff2c020f0fdc5659c59e6a1..f7eda5681b288eb4e912359cb7e065efa46596a3 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java
@@ -25,5 +25,7 @@ public interface PolicyService {
 
     Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService);
 
+    Uni<PolicyRuleState> updatePolicyService(PolicyRuleService policyRuleService);
+
     Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice);
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
index 5a2c0c3a3ebf24a4bab187e6506acb9ca2528d5a..b7f060458b1d2e734cc35fa45a7a2c7bf2719f3d 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java
@@ -81,6 +81,8 @@ public class PolicyServiceImpl implements PolicyService {
             new PolicyRuleState(PolicyRuleStateEnum.POLICY_INEFFECTIVE);
     private static final PolicyRuleState EFFECTIVE_POLICYRULE_STATE =
             new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE);
+    private static final PolicyRuleState UPDATED_POLICYRULE_STATE =
+            new PolicyRuleState(PolicyRuleStateEnum.POLICY_UPDATED);
 
     private final ContextService contextService;
     private final MonitoringService monitoringService;
@@ -121,6 +123,59 @@ public class PolicyServiceImpl implements PolicyService {
         return Long.valueOf(now).doubleValue();
     }
 
+    @Override
+    public Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService) {
+        LOGGER.infof("Received %s", policyRuleService);
+
+        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
+        policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE);
+
+        new Thread(
+                        () -> {
+                            validateService(policyRuleService);
+                        })
+                .start();
+
+        contextService.setPolicyRule(policyRuleBasic);
+
+        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+    }
+
+    @Override
+    public Uni<PolicyRuleState> updatePolicyService(PolicyRuleService policyRuleService) {
+        LOGGER.infof("Received %s", policyRuleService);
+
+        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
+        policyRuleBasic.setPolicyRuleState(UPDATED_POLICYRULE_STATE);
+
+        new Thread(
+                        () -> {
+                            validateUpdatedPolicyService(policyRuleService);
+                        })
+                .start();
+
+        contextService.setPolicyRule(policyRuleBasic);
+
+        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+    }
+
+    @Override
+    public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) {
+        LOGGER.infof("Received %s", policyRuleDevice);
+
+        final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
+        policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE);
+
+        new Thread(
+                        () -> {
+                            validateDevice(policyRuleDevice);
+                        })
+                .start();
+
+        contextService.setPolicyRule(policyRuleBasic);
+        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
+    }
+
     private void provisionAlarm(
             PolicyRuleBasic policyRuleBasic,
             List<AlarmDescriptor> alarmDescriptorList,
@@ -374,6 +429,27 @@ public class PolicyServiceImpl implements PolicyService {
         return;
     }
 
+    private void validateUpdatedPolicyService(PolicyRuleService policyRuleService) {
+
+        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
+        final var isUpdatedPolicyRuleValid =
+                policyRuleConditionValidator.validateUpdatedPolicyRuleId(policyRuleBasic.getPolicyRuleId());
+
+        isUpdatedPolicyRuleValid
+                .subscribe()
+                .with(
+                        policyRuleBoolean -> {
+                            if (Boolean.TRUE.equals(isUpdatedPolicyRuleValid)) {
+                                validateService(policyRuleService);
+                                return;
+                            } else {
+                                policyRuleBasic.setPolicyRuleState(FAILED_POLICYRULE_STATE);
+                                contextService.setPolicyRule(policyRuleBasic);
+                                return;
+                            }
+                        });
+    }
+
     private void validateService(PolicyRuleService policyRuleService) {
         final var serviceId = policyRuleService.getServiceId();
         final var deviceIds = policyRuleService.getDeviceIds();
@@ -626,41 +702,6 @@ public class PolicyServiceImpl implements PolicyService {
                 getTimeStamp());
     }
 
-    @Override
-    public Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService) {
-        LOGGER.infof("Received %s", policyRuleService);
-
-        final var policyRuleBasic = policyRuleService.getPolicyRuleBasic();
-        policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE);
-
-        new Thread(
-                        () -> {
-                            validateService(policyRuleService);
-                        })
-                .start();
-
-        contextService.setPolicyRule(policyRuleBasic);
-
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
-    }
-
-    @Override
-    public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) {
-        LOGGER.infof("Received %s", policyRuleDevice);
-
-        final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic();
-        policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE);
-
-        new Thread(
-                        () -> {
-                            validateDevice(policyRuleDevice);
-                        })
-                .start();
-
-        contextService.setPolicyRule(policyRuleBasic);
-        return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState());
-    }
-
     private List<String> returnInvalidDeviceIds(List<String> deviceIds) {
         var invalidDeviceIds = new ArrayList<String>();
 
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 896c842d90111c423cbc117d33e095ef3288a48e..43db1b00b550914bd5a83552083cf6a26ce4e1ce 100644
--- a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
+++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java
@@ -35,6 +35,8 @@ import java.util.List;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
 
+// TODO: Revisit PolicyRuleBasicValidationTest cases after handling exceptions in PolicyRuleBasic
+// constructor
 @QuarkusTest
 class PolicyRuleBasicValidationTestHelper {
 
diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java
index 4b2f3d6bd9ff9d231328d779b47ac7e873ba5c5f..65bea0d04fa7a7bc64a9c47b032c9c411cb4c5e2 100644
--- a/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java
+++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java
@@ -183,7 +183,7 @@ class PolicyServiceTest {
 
         final var expectedPolicyRuleState =
                 Policy.PolicyRuleState.newBuilder()
-                        .setPolicyRuleState(PolicyRuleStateEnum.POLICY_ENFORCED)
+                        .setPolicyRuleState(PolicyRuleStateEnum.POLICY_UPDATED)
                         .build();
 
         final var policyRuleBasic =