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/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: