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/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";