diff --git a/src/policy/src/main/java/eu/teraflow/policy/Serializer.java b/src/policy/src/main/java/eu/teraflow/policy/Serializer.java
index 9970852124fb0a5334087ef703a6b0fb5b3ef9a8..9e536450873fe9d6e31f66dd71088ae401fce64e 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/Serializer.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/Serializer.java
@@ -56,6 +56,7 @@ import eu.teraflow.policy.context.model.Device;
 import eu.teraflow.policy.context.model.DeviceConfig;
 import eu.teraflow.policy.context.model.DeviceDriverEnum;
 import eu.teraflow.policy.context.model.DeviceOperationalStatus;
+import eu.teraflow.policy.context.model.Empty;
 import eu.teraflow.policy.context.model.EndPoint;
 import eu.teraflow.policy.context.model.EndPointId;
 import eu.teraflow.policy.context.model.Event;
@@ -95,11 +96,15 @@ import eu.teraflow.policy.monitoring.model.KpiValue;
 import eu.teraflow.policy.monitoring.model.KpiValueRange;
 import eu.teraflow.policy.monitoring.model.StringKpiValue;
 import eu.teraflow.policy.monitoring.model.SubsDescriptor;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.stream.Collectors;
 import javax.inject.Singleton;
 import kpi_sample_types.KpiSampleTypes;
 import monitoring.Monitoring;
+import monitoring.Monitoring.AlarmID;
 import monitoring.Monitoring.KpiId;
+import monitoring.Monitoring.SubscriptionID;
 import policy.Policy;
 import policy.Policy.PolicyRuleId;
 import policy.PolicyAction;
@@ -1538,6 +1543,21 @@ public class Serializer {
         return new KpiValueRange(minKpiValue, maxKpiValue);
     }
 
+    public AlarmID serializeAlarmId(String alarmId) {
+        final var builder = Monitoring.AlarmID.newBuilder();
+
+        final var serializedAlarmIdUuid = serializeUuid(alarmId);
+        builder.setAlarmId(serializedAlarmIdUuid);
+
+        return builder.build();
+    }
+
+    public String deserialize(AlarmID serializedAlarmId) {
+        final var serializedAlarmIdUuid = serializedAlarmId.getAlarmId();
+
+        return deserialize(serializedAlarmIdUuid);
+    }
+
     public Monitoring.AlarmDescriptor serialize(AlarmDescriptor alarmDescriptor) {
         final var builder = Monitoring.AlarmDescriptor.newBuilder();
 
@@ -1637,6 +1657,21 @@ public class Serializer {
         return new SubsDescriptor(kpiId, samplingDurationS, samplingIntervalS, startDate, endDate);
     }
 
+    public SubscriptionID serializeSubscriptionIdId(String subscriptionId) {
+        final var builder = Monitoring.SubscriptionID.newBuilder();
+
+        final var serializedSubscriptionIdUuid = serializeUuid(subscriptionId);
+        builder.setSubsId(serializedSubscriptionIdUuid);
+
+        return builder.build();
+    }
+
+    public String deserialize(SubscriptionID serializedSubscriptionId) {
+        final var serializedSubscriptionIdUuid = serializedSubscriptionId.getSubsId();
+
+        return deserialize(serializedSubscriptionIdUuid);
+    }
+
     public PolicyCondition.PolicyRuleCondition serialize(PolicyRuleCondition policyRuleCondition) {
         final var builder = PolicyCondition.PolicyRuleCondition.newBuilder();
 
@@ -1908,6 +1943,28 @@ public class Serializer {
         return new Kpi(kpiId, timestamp, kpiValue);
     }
 
+    public List<Monitoring.Kpi> serialize(List<Kpi> kpis) {
+        List<Monitoring.Kpi> serializedKpis = new ArrayList<>();
+
+        for (Kpi kpi : kpis) {
+            final var serializedKpi = serialize(kpi);
+
+            serializedKpis.add(serializedKpi);
+        }
+        return serializedKpis;
+    }
+
+    public List<Kpi> deserialize(List<Monitoring.Kpi> serializedKpis) {
+        List<Kpi> kpis = new ArrayList<>();
+
+        for (Monitoring.Kpi serializedKpi : serializedKpis) {
+            final var kpi = deserialize(serializedKpi);
+
+            kpis.add(kpi);
+        }
+        return kpis;
+    }
+
     public Monitoring.KpiDescriptor serialize(KpiDescriptor kpiDescriptor) {
         final var builder = Monitoring.KpiDescriptor.newBuilder();
 
@@ -2130,6 +2187,17 @@ public class Serializer {
                 deviceEndPoints);
     }
 
+    public ContextOuterClass.Empty serializeEmpty(Empty empty) {
+
+        final var builder = ContextOuterClass.Empty.newBuilder();
+
+        return builder.build();
+    }
+
+    public Empty deserializeEmpty(ContextOuterClass.Empty serializedEmpty) {
+        return new Empty();
+    }
+
     public Uuid serializeUuid(String uuid) {
         return Uuid.newBuilder().setUuid(uuid).build();
     }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/context/model/Empty.java b/src/policy/src/main/java/eu/teraflow/policy/context/model/Empty.java
new file mode 100644
index 0000000000000000000000000000000000000000..d19dd9776e9688999007761e969e5c1b53d37176
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/context/model/Empty.java
@@ -0,0 +1,24 @@
+/*
+* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package eu.teraflow.policy.context.model;
+
+public class Empty {
+
+    public Empty() {
+        // Empty constructor to represent the Empty rpc message of context service
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringGateway.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringGateway.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b9849a7649894cb4109fb458dac611e834bd916
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringGateway.java
@@ -0,0 +1,48 @@
+/*
+* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package eu.teraflow.policy.monitoring;
+
+import eu.teraflow.policy.context.model.Empty;
+import eu.teraflow.policy.monitoring.model.AlarmDescriptor;
+import eu.teraflow.policy.monitoring.model.AlarmResponse;
+import eu.teraflow.policy.monitoring.model.Kpi;
+import eu.teraflow.policy.monitoring.model.KpiDescriptor;
+import eu.teraflow.policy.monitoring.model.SubsDescriptor;
+import io.smallrye.mutiny.Multi;
+import io.smallrye.mutiny.Uni;
+import java.util.List;
+
+public interface MonitoringGateway {
+
+    Uni<String> createKpi(KpiDescriptor kpiDescriptor);
+
+    Uni<KpiDescriptor> getKpiDescriptor(String kpiId);
+
+    Multi<List<Kpi>> subscribeKpi(SubsDescriptor subsDescriptor);
+
+    Uni<SubsDescriptor> getSubsDescriptor(String subscriptionId);
+
+    Uni<Empty> editKpiSubscription(SubsDescriptor subsDescriptor);
+
+    Uni<String> createKpiAlarm(AlarmDescriptor alarmDescriptor);
+
+    Uni<Empty> editKpiAlarm(AlarmDescriptor alarmDescriptor);
+
+    Uni<AlarmDescriptor> getAlarmDescriptor(String alarmId);
+
+    Multi<AlarmResponse> getAlarmResponseStream(String alarmId);
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringGatewayImpl.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringGatewayImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0b4e088a9e23387f56d956bed5f6e104a68ea56
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringGatewayImpl.java
@@ -0,0 +1,136 @@
+/*
+* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package eu.teraflow.policy.monitoring;
+
+import eu.teraflow.policy.Serializer;
+import eu.teraflow.policy.context.model.Empty;
+import eu.teraflow.policy.monitoring.model.AlarmDescriptor;
+import eu.teraflow.policy.monitoring.model.AlarmResponse;
+import eu.teraflow.policy.monitoring.model.Kpi;
+import eu.teraflow.policy.monitoring.model.KpiDescriptor;
+import eu.teraflow.policy.monitoring.model.SubsDescriptor;
+import io.quarkus.grpc.GrpcClient;
+import io.smallrye.mutiny.Multi;
+import io.smallrye.mutiny.Uni;
+import java.util.List;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import monitoring.MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub;
+
+@ApplicationScoped
+public class MonitoringGatewayImpl implements MonitoringGateway {
+
+    @GrpcClient("monitoring")
+    MutinyMonitoringServiceStub streamingDelegateMonitoring;
+
+    private final Serializer serializer;
+
+    @Inject
+    public MonitoringGatewayImpl(Serializer serializer) {
+        this.serializer = serializer;
+    }
+
+    @Override
+    public Uni<String> createKpi(KpiDescriptor kpiDescriptor) {
+        final var serializedKpiDescriptor = serializer.serialize(kpiDescriptor);
+
+        return streamingDelegateMonitoring
+                .createKpi(serializedKpiDescriptor)
+                .onItem()
+                .transform(serializer::deserialize);
+    }
+
+    @Override
+    public Uni<KpiDescriptor> getKpiDescriptor(String kpiId) {
+        final var serializedKpiId = serializer.serializeKpiId(kpiId);
+
+        return streamingDelegateMonitoring
+                .getKpiDescriptor(serializedKpiId)
+                .onItem()
+                .transform(serializer::deserialize);
+    }
+
+    @Override
+    public Multi<List<Kpi>> subscribeKpi(SubsDescriptor subsDescriptor) {
+        final var serializedSubsDescriptor = serializer.serialize(subsDescriptor);
+
+        return streamingDelegateMonitoring
+                .subscribeKpi(serializedSubsDescriptor)
+                .onItem()
+                .transform(kpiList -> serializer.deserialize(kpiList.getKpiListList()));
+    }
+
+    @Override
+    public Uni<SubsDescriptor> getSubsDescriptor(String subscriptionId) {
+        final var serializedSubscriptionId = serializer.serializeSubscriptionIdId(subscriptionId);
+
+        return streamingDelegateMonitoring
+                .getSubsDescriptor(serializedSubscriptionId)
+                .onItem()
+                .transform(serializer::deserialize);
+    }
+
+    @Override
+    public Uni<Empty> editKpiSubscription(SubsDescriptor subsDescriptor) {
+        final var serializedSubsDescriptor = serializer.serialize(subsDescriptor);
+
+        return streamingDelegateMonitoring
+                .editKpiSubscription(serializedSubsDescriptor)
+                .onItem()
+                .transform(serializer::deserializeEmpty);
+    }
+
+    @Override
+    public Uni<String> createKpiAlarm(AlarmDescriptor alarmDescriptor) {
+        final var serializedAlarmDescriptor = serializer.serialize(alarmDescriptor);
+
+        return streamingDelegateMonitoring
+                .createKpiAlarm(serializedAlarmDescriptor)
+                .onItem()
+                .transform(serializer::deserialize);
+    }
+
+    @Override
+    public Uni<Empty> editKpiAlarm(AlarmDescriptor alarmDescriptor) {
+        final var serializedAlarmDescriptor = serializer.serialize(alarmDescriptor);
+
+        return streamingDelegateMonitoring
+                .editKpiAlarm(serializedAlarmDescriptor)
+                .onItem()
+                .transform(serializer::deserializeEmpty);
+    }
+
+    @Override
+    public Uni<AlarmDescriptor> getAlarmDescriptor(String alarmId) {
+        final var serializedAlarmId = serializer.serializeAlarmId(alarmId);
+
+        return streamingDelegateMonitoring
+                .getAlarmDescriptor(serializedAlarmId)
+                .onItem()
+                .transform(serializer::deserialize);
+    }
+
+    @Override
+    public Multi<AlarmResponse> getAlarmResponseStream(String alarmId) {
+        final var serializedAlarmId = serializer.serializeAlarmId(alarmId);
+
+        return streamingDelegateMonitoring
+                .getAlarmResponseStream(serializedAlarmId)
+                .onItem()
+                .transform(serializer::deserialize);
+    }
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringService.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringService.java
new file mode 100644
index 0000000000000000000000000000000000000000..276a9d3632655cf684ae4dff0469d477ff15a88e
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringService.java
@@ -0,0 +1,48 @@
+/*
+* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package eu.teraflow.policy.monitoring;
+
+import eu.teraflow.policy.context.model.Empty;
+import eu.teraflow.policy.monitoring.model.AlarmDescriptor;
+import eu.teraflow.policy.monitoring.model.AlarmResponse;
+import eu.teraflow.policy.monitoring.model.Kpi;
+import eu.teraflow.policy.monitoring.model.KpiDescriptor;
+import eu.teraflow.policy.monitoring.model.SubsDescriptor;
+import io.smallrye.mutiny.Multi;
+import io.smallrye.mutiny.Uni;
+import java.util.List;
+
+public interface MonitoringService {
+
+    Uni<String> createKpi(KpiDescriptor kpiDescriptor);
+
+    Uni<KpiDescriptor> getKpiDescriptor(String kpiId);
+
+    Multi<List<Kpi>> subscribeKpi(SubsDescriptor subsDescriptor);
+
+    Uni<SubsDescriptor> getSubsDescriptor(String subscriptionId);
+
+    Uni<Empty> editKpiSubscription(SubsDescriptor subsDescriptor);
+
+    Uni<String> createKpiAlarm(AlarmDescriptor alarmDescriptor);
+
+    Uni<Empty> editKpiAlarm(AlarmDescriptor alarmDescriptor);
+
+    Uni<AlarmDescriptor> getAlarmDescriptor(String alarmId);
+
+    Multi<AlarmResponse> getAlarmResponseStream(String alarmId);
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringServiceImpl.java b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1e79af757b9866360040b785fd41dd1f0c70cd4
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/monitoring/MonitoringServiceImpl.java
@@ -0,0 +1,85 @@
+/*
+* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package eu.teraflow.policy.monitoring;
+
+import eu.teraflow.policy.context.model.Empty;
+import eu.teraflow.policy.monitoring.model.AlarmDescriptor;
+import eu.teraflow.policy.monitoring.model.AlarmResponse;
+import eu.teraflow.policy.monitoring.model.Kpi;
+import eu.teraflow.policy.monitoring.model.KpiDescriptor;
+import eu.teraflow.policy.monitoring.model.SubsDescriptor;
+import io.smallrye.mutiny.Multi;
+import io.smallrye.mutiny.Uni;
+import java.util.List;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+@ApplicationScoped
+public class MonitoringServiceImpl implements MonitoringService {
+
+    private final MonitoringGateway monitoringGateway;
+
+    @Inject
+    public MonitoringServiceImpl(MonitoringGateway monitoringGateway) {
+        this.monitoringGateway = monitoringGateway;
+    }
+
+    @Override
+    public Uni<String> createKpi(KpiDescriptor kpiDescriptor) {
+        return monitoringGateway.createKpi(kpiDescriptor);
+    }
+
+    @Override
+    public Uni<KpiDescriptor> getKpiDescriptor(String kpiId) {
+        return monitoringGateway.getKpiDescriptor(kpiId);
+    }
+
+    @Override
+    public Multi<List<Kpi>> subscribeKpi(SubsDescriptor subsDescriptor) {
+        return monitoringGateway.subscribeKpi(subsDescriptor);
+    }
+
+    @Override
+    public Uni<SubsDescriptor> getSubsDescriptor(String subscriptionId) {
+        return monitoringGateway.getSubsDescriptor(subscriptionId);
+    }
+
+    @Override
+    public Uni<Empty> editKpiSubscription(SubsDescriptor subsDescriptor) {
+        return monitoringGateway.editKpiSubscription(subsDescriptor);
+    }
+
+    @Override
+    public Uni<String> createKpiAlarm(AlarmDescriptor alarmDescriptor) {
+        return monitoringGateway.createKpiAlarm(alarmDescriptor);
+    }
+
+    @Override
+    public Uni<Empty> editKpiAlarm(AlarmDescriptor alarmDescriptor) {
+        return monitoringGateway.editKpiAlarm(alarmDescriptor);
+    }
+
+    @Override
+    public Uni<AlarmDescriptor> getAlarmDescriptor(String alarmId) {
+        return monitoringGateway.getAlarmDescriptor(alarmId);
+    }
+
+    @Override
+    public Multi<AlarmResponse> getAlarmResponseStream(String alarmId) {
+        return monitoringGateway.getAlarmResponseStream(alarmId);
+    }
+}
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 e8c582013366c993992ff3fd504bb9b2c7578c17..40e8ce80bacc02cca70a730f0f5a618e761d597d 100644
--- a/src/policy/src/test/java/eu/teraflow/policy/SerializerTest.java
+++ b/src/policy/src/test/java/eu/teraflow/policy/SerializerTest.java
@@ -57,6 +57,7 @@ import eu.teraflow.policy.context.model.Device;
 import eu.teraflow.policy.context.model.DeviceConfig;
 import eu.teraflow.policy.context.model.DeviceDriverEnum;
 import eu.teraflow.policy.context.model.DeviceOperationalStatus;
+import eu.teraflow.policy.context.model.Empty;
 import eu.teraflow.policy.context.model.EndPoint;
 import eu.teraflow.policy.context.model.EndPointId;
 import eu.teraflow.policy.context.model.Event;
@@ -2317,6 +2318,35 @@ class SerializerTest {
         assertThat(numericalOperator).isEqualTo(expectedNumericalOperator);
     }
 
+    @Test
+    void shouldSerializeSubscriptionId() {
+        final var subscriptionId = "subscriptionId";
+
+        final var subscriptionIdUuid = serializer.serializeUuid(subscriptionId);
+
+        final var expectedSubscriptionId =
+                Monitoring.SubscriptionID.newBuilder().setSubsId(subscriptionIdUuid).build();
+
+        final var serializedSubscriptionId = serializer.serializeSubscriptionIdId(subscriptionId);
+
+        assertThat(serializedSubscriptionId)
+                .usingRecursiveComparison()
+                .isEqualTo(expectedSubscriptionId);
+    }
+
+    @Test
+    void shouldDeserializeSubscriptionId() {
+        final var expectedSubscriptionId = "expectedSubscriptionId";
+
+        final var serializedSubscriptionIdUuid = serializer.serializeUuid(expectedSubscriptionId);
+        final var serializedSubscriptionId =
+                Monitoring.SubscriptionID.newBuilder().setSubsId(serializedSubscriptionIdUuid).build();
+
+        final var subscriptionId = serializer.deserialize(serializedSubscriptionId);
+
+        assertThat(subscriptionId).isEqualTo(expectedSubscriptionId);
+    }
+
     @ParameterizedTest
     @MethodSource("provideNumericalOperator")
     void shouldSerializePolicyRuleConditionGivenMultipleNumericalOperators(
@@ -2367,7 +2397,7 @@ class SerializerTest {
 
     @ParameterizedTest
     @MethodSource("provideKpiValues")
-    void shouldSerializeKpiValues(KpiValue kpiValue, Monitoring.KpiValue expectedKpiValue) {
+    void shouldSerializeKpiValues(KpiValue<?> kpiValue, Monitoring.KpiValue expectedKpiValue) {
         final var serializedKpiValue = serializer.serialize(kpiValue);
 
         assertThat(serializedKpiValue).isEqualTo(expectedKpiValue);
@@ -2376,7 +2406,7 @@ class SerializerTest {
     @ParameterizedTest
     @MethodSource("provideKpiValues")
     void shouldDeserializeKpiValues(
-            KpiValue expectedKpiValue, Monitoring.KpiValue serializedKpiValue) {
+            KpiValue<?> expectedKpiValue, Monitoring.KpiValue serializedKpiValue) {
         final var kpiValue = serializer.deserialize(serializedKpiValue);
 
         assertThat(kpiValue).usingRecursiveComparison().isEqualTo(expectedKpiValue);
@@ -2556,6 +2586,32 @@ class SerializerTest {
                 .isEqualTo(expectedKpiValueRange.getKpiMaxValue());
     }
 
+    @Test
+    void shouldSerializeAlarmId() {
+        final var alarmId = "alarmId";
+
+        final var alarmIdUuid = serializer.serializeUuid(alarmId);
+
+        final var expectedAlarmId = Monitoring.AlarmID.newBuilder().setAlarmId(alarmIdUuid).build();
+
+        final var serializedAlarmId = serializer.serializeAlarmId(alarmId);
+
+        assertThat(serializedAlarmId).usingRecursiveComparison().isEqualTo(expectedAlarmId);
+    }
+
+    @Test
+    void shouldDeserializeAlarmId() {
+        final var expectedAlarmId = "expectedAlarmId";
+
+        final var serializedAlarmIdUuid = serializer.serializeUuid(expectedAlarmId);
+        final var serializedAlarmId =
+                Monitoring.KpiId.newBuilder().setKpiId(serializedAlarmIdUuid).build();
+
+        final var alarmId = serializer.deserialize(serializedAlarmId);
+
+        assertThat(alarmId).isEqualTo(expectedAlarmId);
+    }
+
     @Test
     void shouldSerializeAlarmDescriptor() {
         final var alarmDescription = "alarmDescription";
@@ -3091,6 +3147,84 @@ class SerializerTest {
         assertThat(kpi).usingRecursiveComparison().isEqualTo(expectedKpi);
     }
 
+    @Test
+    void shouldSerializeKpisList() {
+        final var expectedKpiIdA = "expectedKpiIdA";
+        final var expectedTimestampA = "expectedTimestampA";
+        final var expectedKpiValueA = new FloatKpiValue(643.45f);
+        final var serializedKpiIdA = serializer.serializeKpiId(expectedKpiIdA);
+        final var serializedKpiValueA = serializer.serialize(expectedKpiValueA);
+        final var kpiA = new Kpi(expectedKpiIdA, expectedTimestampA, expectedKpiValueA);
+
+        final var expectedKpiIdB = "expectedKpiIdB";
+        final var expectedTimestampB = "expectedTimestampB";
+        final var expectedKpiValueB = new IntegerKpiValue(32);
+        final var serializedKpiIdB = serializer.serializeKpiId(expectedKpiIdB);
+        final var serializedKpiValueB = serializer.serialize(expectedKpiValueB);
+        final var kpiB = new Kpi(expectedKpiIdB, expectedTimestampB, expectedKpiValueB);
+
+        final var kpis = List.of(kpiA, kpiB);
+
+        final var expectedKpiA =
+                Monitoring.Kpi.newBuilder()
+                        .setKpiId(serializedKpiIdA)
+                        .setTimestamp(expectedTimestampA)
+                        .setKpiValue(serializedKpiValueA)
+                        .build();
+
+        final var expectedKpiB =
+                Monitoring.Kpi.newBuilder()
+                        .setKpiId(serializedKpiIdB)
+                        .setTimestamp(expectedTimestampB)
+                        .setKpiValue(serializedKpiValueB)
+                        .build();
+
+        final var expectedKpis = List.of(expectedKpiA, expectedKpiB);
+
+        final var serializedKpis = serializer.serialize(kpis);
+
+        assertThat(serializedKpis).usingRecursiveComparison().isEqualTo(expectedKpis);
+    }
+
+    @Test
+    void shouldDeserializeKpisList() {
+        final var expectedKpiIdA = "expectedKpiIdA";
+        final var expectedTimestampA = "expectedTimestampA";
+        final var expectedKpiValueA = new FloatKpiValue(643.45f);
+        final var serializedKpiIdA = serializer.serializeKpiId(expectedKpiIdA);
+        final var serializedKpiValueA = serializer.serialize(expectedKpiValueA);
+        final var expectedKpiA = new Kpi(expectedKpiIdA, expectedTimestampA, expectedKpiValueA);
+
+        final var expectedKpiIdB = "expectedKpiIdB";
+        final var expectedTimestampB = "expectedTimestampB";
+        final var expectedKpiValueB = new IntegerKpiValue(32);
+        final var serializedKpiIdB = serializer.serializeKpiId(expectedKpiIdB);
+        final var serializedKpiValueB = serializer.serialize(expectedKpiValueB);
+        final var expectedKpiB = new Kpi(expectedKpiIdB, expectedTimestampB, expectedKpiValueB);
+
+        final var expectedKpis = List.of(expectedKpiA, expectedKpiB);
+
+        final var serializedKpiA =
+                Monitoring.Kpi.newBuilder()
+                        .setKpiId(serializedKpiIdA)
+                        .setTimestamp(expectedTimestampA)
+                        .setKpiValue(serializedKpiValueA)
+                        .build();
+
+        final var serializedKpiB =
+                Monitoring.Kpi.newBuilder()
+                        .setKpiId(serializedKpiIdB)
+                        .setTimestamp(expectedTimestampB)
+                        .setKpiValue(serializedKpiValueB)
+                        .build();
+
+        final var serializedKpis = List.of(serializedKpiA, serializedKpiB);
+
+        final var kpis = serializer.deserialize(serializedKpis);
+
+        assertThat(kpis).usingRecursiveComparison().isEqualTo(expectedKpis);
+    }
+
     @Test
     void shouldSerializeKpiDescriptor() {
         final var expectedKpiDescription = "expectedKpiDescription";
@@ -3581,6 +3715,27 @@ class SerializerTest {
         assertThat(device).usingRecursiveComparison().isEqualTo(expectedDevice);
     }
 
+    @Test
+    void shouldSerializeEmpty() {
+        final var empty = new Empty();
+        final var expectedEmpty = ContextOuterClass.Empty.newBuilder().build();
+
+        final var serializeEmpty = serializer.serializeEmpty(empty);
+
+        assertThat(serializeEmpty).isEqualTo(expectedEmpty);
+    }
+
+    @Test
+    void shouldDeserializeEmpty() {
+        final var expectedEmpty = new Empty();
+
+        final var serializedEmpty = serializer.serializeEmpty(expectedEmpty);
+
+        final var empty = serializer.deserializeEmpty(serializedEmpty);
+
+        assertThat(empty).usingRecursiveComparison().isEqualTo(expectedEmpty);
+    }
+
     @Test
     void shouldSerializeUuid() {
         final var expectedUuid = "uuid";
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index 06068f0f5983b4ef385ee60b8a6cb5d812cab253..273778787a08fae57ed9282d075950041fc2f010 100644
--- a/src/policy/target/kubernetes/kubernetes.yml
+++ b/src/policy/target/kubernetes/kubernetes.yml
@@ -3,8 +3,8 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 1d77cb00ae8f577885de32f01f4740f865853863
-    app.quarkus.io/build-timestamp: 2022-07-26 - 10:46:55 +0000
+    app.quarkus.io/commit-id: 57e16fed85037f2415bac3b1a55997ac4967fd99
+    app.quarkus.io/build-timestamp: 2022-07-27 - 11:40:31 +0000
   labels:
     app.kubernetes.io/name: policyservice
     app: policyservice
@@ -25,8 +25,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 1d77cb00ae8f577885de32f01f4740f865853863
-    app.quarkus.io/build-timestamp: 2022-07-26 - 10:46:55 +0000
+    app.quarkus.io/commit-id: 57e16fed85037f2415bac3b1a55997ac4967fd99
+    app.quarkus.io/build-timestamp: 2022-07-27 - 11:40:31 +0000
   labels:
     app: policyservice
     app.kubernetes.io/name: policyservice
@@ -39,8 +39,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 1d77cb00ae8f577885de32f01f4740f865853863
-        app.quarkus.io/build-timestamp: 2022-07-26 - 10:46:55 +0000
+        app.quarkus.io/commit-id: 57e16fed85037f2415bac3b1a55997ac4967fd99
+        app.quarkus.io/build-timestamp: 2022-07-27 - 11:40:31 +0000
       labels:
         app: policyservice
         app.kubernetes.io/name: policyservice
@@ -51,12 +51,12 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: SERVICE_SERVICE_HOST
-              value: serviceservice
             - name: MONITORING_SERVICE_HOST
               value: monitoringservice
             - name: CONTEXT_SERVICE_HOST
               value: contextservice
+            - name: SERVICE_SERVICE_HOST
+              value: serviceservice
           image: registry.gitlab.com/teraflow-h2020/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe: