diff --git a/proto/monitoring.proto b/proto/monitoring.proto
index 1b1f1fbb73e64e6ccdc895c206f662d1499348a0..42c70bd1f0be8aaedab9057bfd289d4379c3e111 100644
--- a/proto/monitoring.proto
+++ b/proto/monitoring.proto
@@ -5,15 +5,15 @@ package monitoring;
 import "context.proto";
 
 service MonitoringService {
-  rpc CreateKpi (KpiRequest) returns (KpiId) {}
+  rpc CreateKpi (CreateKpiRequest) returns (KpiId) {}
   rpc IncludeKpi (IncludeKpiRequest) returns (context.Empty) {}
   rpc MonitorKpi (MonitorKpiRequest) returns (context.Empty) {}
-  rpc MonitoriDeviceKpi (MonitorKpiRequest) returns (context.Empty) {}
+  rpc MonitorDeviceKpi (MonitorDeviceKpiRequest) returns (context.Empty) {}
   rpc GetStreamKpi ( KpiId ) returns (stream Kpi) {}
   rpc GetInstantKpi ( KpiId ) returns (Kpi) {}
 }
 
-message KpiRequest{
+message CreateKpiRequest{
   string kpiDescription = 1;
   context.DeviceId device_id = 2;
   KpiSampleType kpi_sample_type = 3;
@@ -24,7 +24,13 @@ message KpiRequest{
 
 message MonitorKpiRequest{
   KpiId kpi_id = 1;
-  uint32 Connexion_time_s = 2;
+  uint32 connexion_time_s = 2;
+  uint32 sample_rate_ms = 3;
+}
+
+message MonitorDeviceKpiRequest{
+  Kpi kpi = 1;
+  uint32 connexion_time_s = 2;
   uint32 sample_rate_ms = 3;
 }
 
diff --git a/src/monitoring/client/monitoring_client.py b/src/monitoring/client/monitoring_client.py
index f9a974d22bd9ad824abff9fe1a9125db59406cb0..50086a05de82259f2b84ba7288cde9f04dfad152 100644
--- a/src/monitoring/client/monitoring_client.py
+++ b/src/monitoring/client/monitoring_client.py
@@ -17,17 +17,29 @@ class MonitoringClient:
         self.channel = grpc.insecure_channel(endpoint)
         self.server = monitoring_pb2_grpc.MonitoringServiceStub(self.channel)
 
-    def IncludeKpi(self, request):
-        LOGGER.info('IncludeKpi: {}'.format(request))
-        response = self.server.IncludeKpi(request)
-        LOGGER.info('IncludeKpi result: {}'.format(response))
+    def CreateKpi(self, request):
+        LOGGER.info('CreateKpi: {}'.format(request))
+        response = self.server.CreateKpi(request)
+        LOGGER.info('CreateKpi result: {}'.format(response))
         return monitoring_pb2.KpiId()
 
     def MonitorKpi(self, request):
         LOGGER.info('MonitorKpi: {}'.format(request))
         response = self.server.MonitorKpi(request)
         LOGGER.info('MonitorKpi result: {}'.format(response))
-        return monitoring_pb2.Kpi()
+        return context_pb2.Empty()
+
+    def MonitorDeviceKpi(self, request):
+        LOGGER.info('MonitorDeviceKpi: {}'.format(request))
+        response = self.server.MonitorDeviceKpi(request)
+        LOGGER.info('MonitorDeviceKpi result: {}'.format(response))
+        return context_pb2.Empty()
+
+    def IncludeKpi(self, request):
+        LOGGER.info('IncludeKpi: {}'.format(request))
+        response = self.server.IncludeKpi(request)
+        LOGGER.info('IncludeKpi result: {}'.format(response))
+        return context_pb2.Empty()
 
     def GetStreamKpi(self, request):
         LOGGER.info('GetStreamKpi: {}'.format(request))
diff --git a/src/monitoring/proto/monitoring_pb2.py b/src/monitoring/proto/monitoring_pb2.py
index b586f3e9496a96d16190c49e7734e78ee8d333d4..00ac0ea0b01d71e3a661ee601012784cadeabd60 100644
--- a/src/monitoring/proto/monitoring_pb2.py
+++ b/src/monitoring/proto/monitoring_pb2.py
@@ -21,7 +21,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   package='monitoring',
   syntax='proto3',
   serialized_options=None,
-  serialized_pb=_b('\n\x10monitoring.proto\x12\nmonitoring\x1a\rcontext.proto\"~\n\nKpiRequest\x12\x16\n\x0ekpiDescription\x18\x01 \x01(\t\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12\x32\n\x0fkpi_sample_type\x18\x03 \x01(\x0e\x32\x19.monitoring.KpiSampleType\"h\n\x11MonitorKpiRequest\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x18\n\x10\x43onnexion_time_s\x18\x02 \x01(\r\x12\x16\n\x0esample_rate_ms\x18\x03 \x01(\r\"s\n\x11IncludeKpiRequest\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x12\n\ntime_stamp\x18\x02 \x01(\t\x12\'\n\tkpi_value\x18\x03 \x01(\x0b\x32\x14.monitoring.KpiValue\"\xd6\x01\n\x03Kpi\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12\x16\n\x0ekpiDescription\x18\x03 \x01(\t\x12\'\n\tkpi_value\x18\x04 \x01(\x0b\x32\x14.monitoring.KpiValue\x12\x32\n\x0fkpi_sample_type\x18\x05 \x01(\x0e\x32\x19.monitoring.KpiSampleType\x12$\n\tdevice_id\x18\x06 \x01(\x0b\x32\x11.context.DeviceId\"&\n\x05KpiId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"T\n\tKpiDevice\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"+\n\x07KpiList\x12 \n\x07kpiList\x18\x01 \x03(\x0b\x32\x0f.monitoring.Kpi\"M\n\x08KpiValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x13\n\tstringVal\x18\x02 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x03 \x01(\x08H\x00\x42\x07\n\x05value*x\n\rKpiSampleType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x17\n\x13PACKETS_TRANSMITTED\x10\x65\x12\x14\n\x10PACKETS_RECEIVED\x10\x66\x12\x16\n\x11\x42YTES_TRANSMITTED\x10\xc9\x01\x12\x13\n\x0e\x42YTES_RECEIVED\x10\xca\x01\x32\x80\x03\n\x11MonitoringService\x12\x38\n\tCreateKpi\x12\x16.monitoring.KpiRequest\x1a\x11.monitoring.KpiId\"\x00\x12=\n\nIncludeKpi\x12\x1d.monitoring.IncludeKpiRequest\x1a\x0e.context.Empty\"\x00\x12=\n\nMonitorKpi\x12\x1d.monitoring.MonitorKpiRequest\x1a\x0e.context.Empty\"\x00\x12\x44\n\x11MonitoriDeviceKpi\x12\x1d.monitoring.MonitorKpiRequest\x1a\x0e.context.Empty\"\x00\x12\x36\n\x0cGetStreamKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x30\x01\x12\x35\n\rGetInstantKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x62\x06proto3')
+  serialized_pb=_b('\n\x10monitoring.proto\x12\nmonitoring\x1a\rcontext.proto\"\x84\x01\n\x10\x43reateKpiRequest\x12\x16\n\x0ekpiDescription\x18\x01 \x01(\t\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12\x32\n\x0fkpi_sample_type\x18\x03 \x01(\x0e\x32\x19.monitoring.KpiSampleType\"h\n\x11MonitorKpiRequest\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x18\n\x10\x63onnexion_time_s\x18\x02 \x01(\r\x12\x16\n\x0esample_rate_ms\x18\x03 \x01(\r\"i\n\x17MonitorDeviceKpiRequest\x12\x1c\n\x03kpi\x18\x01 \x01(\x0b\x32\x0f.monitoring.Kpi\x12\x18\n\x10\x63onnexion_time_s\x18\x02 \x01(\r\x12\x16\n\x0esample_rate_ms\x18\x03 \x01(\r\"s\n\x11IncludeKpiRequest\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x12\n\ntime_stamp\x18\x02 \x01(\t\x12\'\n\tkpi_value\x18\x03 \x01(\x0b\x32\x14.monitoring.KpiValue\"\xd6\x01\n\x03Kpi\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12\x16\n\x0ekpiDescription\x18\x03 \x01(\t\x12\'\n\tkpi_value\x18\x04 \x01(\x0b\x32\x14.monitoring.KpiValue\x12\x32\n\x0fkpi_sample_type\x18\x05 \x01(\x0e\x32\x19.monitoring.KpiSampleType\x12$\n\tdevice_id\x18\x06 \x01(\x0b\x32\x11.context.DeviceId\"&\n\x05KpiId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"T\n\tKpiDevice\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"+\n\x07KpiList\x12 \n\x07kpiList\x18\x01 \x03(\x0b\x32\x0f.monitoring.Kpi\"M\n\x08KpiValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x13\n\tstringVal\x18\x02 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x03 \x01(\x08H\x00\x42\x07\n\x05value*x\n\rKpiSampleType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x17\n\x13PACKETS_TRANSMITTED\x10\x65\x12\x14\n\x10PACKETS_RECEIVED\x10\x66\x12\x16\n\x11\x42YTES_TRANSMITTED\x10\xc9\x01\x12\x13\n\x0e\x42YTES_RECEIVED\x10\xca\x01\x32\x8b\x03\n\x11MonitoringService\x12>\n\tCreateKpi\x12\x1c.monitoring.CreateKpiRequest\x1a\x11.monitoring.KpiId\"\x00\x12=\n\nIncludeKpi\x12\x1d.monitoring.IncludeKpiRequest\x1a\x0e.context.Empty\"\x00\x12=\n\nMonitorKpi\x12\x1d.monitoring.MonitorKpiRequest\x1a\x0e.context.Empty\"\x00\x12I\n\x10MonitorDeviceKpi\x12#.monitoring.MonitorDeviceKpiRequest\x1a\x0e.context.Empty\"\x00\x12\x36\n\x0cGetStreamKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x30\x01\x12\x35\n\rGetInstantKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x62\x06proto3')
   ,
   dependencies=[context__pb2.DESCRIPTOR,])
 
@@ -54,8 +54,8 @@ _KPISAMPLETYPE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=865,
-  serialized_end=985,
+  serialized_start=979,
+  serialized_end=1099,
 )
 _sym_db.RegisterEnumDescriptor(_KPISAMPLETYPE)
 
@@ -68,29 +68,29 @@ BYTES_RECEIVED = 202
 
 
 
-_KPIREQUEST = _descriptor.Descriptor(
-  name='KpiRequest',
-  full_name='monitoring.KpiRequest',
+_CREATEKPIREQUEST = _descriptor.Descriptor(
+  name='CreateKpiRequest',
+  full_name='monitoring.CreateKpiRequest',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='kpiDescription', full_name='monitoring.KpiRequest.kpiDescription', index=0,
+      name='kpiDescription', full_name='monitoring.CreateKpiRequest.kpiDescription', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='device_id', full_name='monitoring.KpiRequest.device_id', index=1,
+      name='device_id', full_name='monitoring.CreateKpiRequest.device_id', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='kpi_sample_type', full_name='monitoring.KpiRequest.kpi_sample_type', index=2,
+      name='kpi_sample_type', full_name='monitoring.CreateKpiRequest.kpi_sample_type', index=2,
       number=3, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -108,8 +108,8 @@ _KPIREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=47,
-  serialized_end=173,
+  serialized_start=48,
+  serialized_end=180,
 )
 
 
@@ -128,7 +128,7 @@ _MONITORKPIREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='Connexion_time_s', full_name='monitoring.MonitorKpiRequest.Connexion_time_s', index=1,
+      name='connexion_time_s', full_name='monitoring.MonitorKpiRequest.connexion_time_s', index=1,
       number=2, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -153,8 +153,53 @@ _MONITORKPIREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=175,
-  serialized_end=279,
+  serialized_start=182,
+  serialized_end=286,
+)
+
+
+_MONITORDEVICEKPIREQUEST = _descriptor.Descriptor(
+  name='MonitorDeviceKpiRequest',
+  full_name='monitoring.MonitorDeviceKpiRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='kpi', full_name='monitoring.MonitorDeviceKpiRequest.kpi', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='connexion_time_s', full_name='monitoring.MonitorDeviceKpiRequest.connexion_time_s', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sample_rate_ms', full_name='monitoring.MonitorDeviceKpiRequest.sample_rate_ms', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=288,
+  serialized_end=393,
 )
 
 
@@ -198,8 +243,8 @@ _INCLUDEKPIREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=281,
-  serialized_end=396,
+  serialized_start=395,
+  serialized_end=510,
 )
 
 
@@ -264,8 +309,8 @@ _KPI = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=399,
-  serialized_end=613,
+  serialized_start=513,
+  serialized_end=727,
 )
 
 
@@ -295,8 +340,8 @@ _KPIID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=615,
-  serialized_end=653,
+  serialized_start=729,
+  serialized_end=767,
 )
 
 
@@ -333,8 +378,8 @@ _KPIDEVICE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=655,
-  serialized_end=739,
+  serialized_start=769,
+  serialized_end=853,
 )
 
 
@@ -364,8 +409,8 @@ _KPILIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=741,
-  serialized_end=784,
+  serialized_start=855,
+  serialized_end=898,
 )
 
 
@@ -412,13 +457,14 @@ _KPIVALUE = _descriptor.Descriptor(
       name='value', full_name='monitoring.KpiValue.value',
       index=0, containing_type=None, fields=[]),
   ],
-  serialized_start=786,
-  serialized_end=863,
+  serialized_start=900,
+  serialized_end=977,
 )
 
-_KPIREQUEST.fields_by_name['device_id'].message_type = context__pb2._DEVICEID
-_KPIREQUEST.fields_by_name['kpi_sample_type'].enum_type = _KPISAMPLETYPE
+_CREATEKPIREQUEST.fields_by_name['device_id'].message_type = context__pb2._DEVICEID
+_CREATEKPIREQUEST.fields_by_name['kpi_sample_type'].enum_type = _KPISAMPLETYPE
 _MONITORKPIREQUEST.fields_by_name['kpi_id'].message_type = _KPIID
+_MONITORDEVICEKPIREQUEST.fields_by_name['kpi'].message_type = _KPI
 _INCLUDEKPIREQUEST.fields_by_name['kpi_id'].message_type = _KPIID
 _INCLUDEKPIREQUEST.fields_by_name['kpi_value'].message_type = _KPIVALUE
 _KPI.fields_by_name['kpi_id'].message_type = _KPIID
@@ -438,8 +484,9 @@ _KPIVALUE.fields_by_name['stringVal'].containing_oneof = _KPIVALUE.oneofs_by_nam
 _KPIVALUE.oneofs_by_name['value'].fields.append(
   _KPIVALUE.fields_by_name['boolVal'])
 _KPIVALUE.fields_by_name['boolVal'].containing_oneof = _KPIVALUE.oneofs_by_name['value']
-DESCRIPTOR.message_types_by_name['KpiRequest'] = _KPIREQUEST
+DESCRIPTOR.message_types_by_name['CreateKpiRequest'] = _CREATEKPIREQUEST
 DESCRIPTOR.message_types_by_name['MonitorKpiRequest'] = _MONITORKPIREQUEST
+DESCRIPTOR.message_types_by_name['MonitorDeviceKpiRequest'] = _MONITORDEVICEKPIREQUEST
 DESCRIPTOR.message_types_by_name['IncludeKpiRequest'] = _INCLUDEKPIREQUEST
 DESCRIPTOR.message_types_by_name['Kpi'] = _KPI
 DESCRIPTOR.message_types_by_name['KpiId'] = _KPIID
@@ -449,12 +496,12 @@ DESCRIPTOR.message_types_by_name['KpiValue'] = _KPIVALUE
 DESCRIPTOR.enum_types_by_name['KpiSampleType'] = _KPISAMPLETYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-KpiRequest = _reflection.GeneratedProtocolMessageType('KpiRequest', (_message.Message,), dict(
-  DESCRIPTOR = _KPIREQUEST,
+CreateKpiRequest = _reflection.GeneratedProtocolMessageType('CreateKpiRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CREATEKPIREQUEST,
   __module__ = 'monitoring_pb2'
-  # @@protoc_insertion_point(class_scope:monitoring.KpiRequest)
+  # @@protoc_insertion_point(class_scope:monitoring.CreateKpiRequest)
   ))
-_sym_db.RegisterMessage(KpiRequest)
+_sym_db.RegisterMessage(CreateKpiRequest)
 
 MonitorKpiRequest = _reflection.GeneratedProtocolMessageType('MonitorKpiRequest', (_message.Message,), dict(
   DESCRIPTOR = _MONITORKPIREQUEST,
@@ -463,6 +510,13 @@ MonitorKpiRequest = _reflection.GeneratedProtocolMessageType('MonitorKpiRequest'
   ))
 _sym_db.RegisterMessage(MonitorKpiRequest)
 
+MonitorDeviceKpiRequest = _reflection.GeneratedProtocolMessageType('MonitorDeviceKpiRequest', (_message.Message,), dict(
+  DESCRIPTOR = _MONITORDEVICEKPIREQUEST,
+  __module__ = 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.MonitorDeviceKpiRequest)
+  ))
+_sym_db.RegisterMessage(MonitorDeviceKpiRequest)
+
 IncludeKpiRequest = _reflection.GeneratedProtocolMessageType('IncludeKpiRequest', (_message.Message,), dict(
   DESCRIPTOR = _INCLUDEKPIREQUEST,
   __module__ = 'monitoring_pb2'
@@ -513,15 +567,15 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=988,
-  serialized_end=1372,
+  serialized_start=1102,
+  serialized_end=1497,
   methods=[
   _descriptor.MethodDescriptor(
     name='CreateKpi',
     full_name='monitoring.MonitoringService.CreateKpi',
     index=0,
     containing_service=None,
-    input_type=_KPIREQUEST,
+    input_type=_CREATEKPIREQUEST,
     output_type=_KPIID,
     serialized_options=None,
   ),
@@ -544,11 +598,11 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
     serialized_options=None,
   ),
   _descriptor.MethodDescriptor(
-    name='MonitoriDeviceKpi',
-    full_name='monitoring.MonitoringService.MonitoriDeviceKpi',
+    name='MonitorDeviceKpi',
+    full_name='monitoring.MonitoringService.MonitorDeviceKpi',
     index=3,
     containing_service=None,
-    input_type=_MONITORKPIREQUEST,
+    input_type=_MONITORDEVICEKPIREQUEST,
     output_type=context__pb2._EMPTY,
     serialized_options=None,
   ),
diff --git a/src/monitoring/proto/monitoring_pb2_grpc.py b/src/monitoring/proto/monitoring_pb2_grpc.py
index 13fadc3eb3d7a257f7bb685a848b27720dba1aa3..f55d82c3dc64cb31029a417484ec989dd9000bab 100644
--- a/src/monitoring/proto/monitoring_pb2_grpc.py
+++ b/src/monitoring/proto/monitoring_pb2_grpc.py
@@ -17,7 +17,7 @@ class MonitoringServiceStub(object):
     """
     self.CreateKpi = channel.unary_unary(
         '/monitoring.MonitoringService/CreateKpi',
-        request_serializer=monitoring__pb2.KpiRequest.SerializeToString,
+        request_serializer=monitoring__pb2.CreateKpiRequest.SerializeToString,
         response_deserializer=monitoring__pb2.KpiId.FromString,
         )
     self.IncludeKpi = channel.unary_unary(
@@ -30,9 +30,9 @@ class MonitoringServiceStub(object):
         request_serializer=monitoring__pb2.MonitorKpiRequest.SerializeToString,
         response_deserializer=context__pb2.Empty.FromString,
         )
-    self.MonitoriDeviceKpi = channel.unary_unary(
-        '/monitoring.MonitoringService/MonitoriDeviceKpi',
-        request_serializer=monitoring__pb2.MonitorKpiRequest.SerializeToString,
+    self.MonitorDeviceKpi = channel.unary_unary(
+        '/monitoring.MonitoringService/MonitorDeviceKpi',
+        request_serializer=monitoring__pb2.MonitorDeviceKpiRequest.SerializeToString,
         response_deserializer=context__pb2.Empty.FromString,
         )
     self.GetStreamKpi = channel.unary_stream(
@@ -72,7 +72,7 @@ class MonitoringServiceServicer(object):
     context.set_details('Method not implemented!')
     raise NotImplementedError('Method not implemented!')
 
-  def MonitoriDeviceKpi(self, request, context):
+  def MonitorDeviceKpi(self, request, context):
     # missing associated documentation comment in .proto file
     pass
     context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -98,7 +98,7 @@ def add_MonitoringServiceServicer_to_server(servicer, server):
   rpc_method_handlers = {
       'CreateKpi': grpc.unary_unary_rpc_method_handler(
           servicer.CreateKpi,
-          request_deserializer=monitoring__pb2.KpiRequest.FromString,
+          request_deserializer=monitoring__pb2.CreateKpiRequest.FromString,
           response_serializer=monitoring__pb2.KpiId.SerializeToString,
       ),
       'IncludeKpi': grpc.unary_unary_rpc_method_handler(
@@ -111,9 +111,9 @@ def add_MonitoringServiceServicer_to_server(servicer, server):
           request_deserializer=monitoring__pb2.MonitorKpiRequest.FromString,
           response_serializer=context__pb2.Empty.SerializeToString,
       ),
-      'MonitoriDeviceKpi': grpc.unary_unary_rpc_method_handler(
-          servicer.MonitoriDeviceKpi,
-          request_deserializer=monitoring__pb2.MonitorKpiRequest.FromString,
+      'MonitorDeviceKpi': grpc.unary_unary_rpc_method_handler(
+          servicer.MonitorDeviceKpi,
+          request_deserializer=monitoring__pb2.MonitorDeviceKpiRequest.FromString,
           response_serializer=context__pb2.Empty.SerializeToString,
       ),
       'GetStreamKpi': grpc.unary_stream_rpc_method_handler(
diff --git a/src/monitoring/service/monitoring_server.py b/src/monitoring/service/monitoring_server.py
index 1c6375cd2a8cfae40beefae40e28228c97749c65..c787277eb0356dcfdf6b4278e3cb343ebbe9855c 100644
--- a/src/monitoring/service/monitoring_server.py
+++ b/src/monitoring/service/monitoring_server.py
@@ -2,6 +2,9 @@
 
 import os
 from concurrent import futures
+
+from src.monitoring.client import monitoring_client
+from src.monitoring.client.monitoring_client import MonitoringClient
 from src.monitoring.proto import context_pb2
 import grpc
 
@@ -25,6 +28,7 @@ import threading
 from prometheus_client import start_http_server, Summary
 from prometheus_client import Counter, Gauge
 
+SERVER_ADDRESS = SERVER_ADDRESS = '127.0.0.1'
 PORT = 7070
 
 MONITORING_GETINSTANTKPI_REQUEST_TIME = Summary('monitoring_getinstantkpi_processing_seconds', 'Time spent processing monitoring instant kpi request')
@@ -35,16 +39,56 @@ class MonitoringServiceServicerImpl(monitoring_pb2_grpc.MonitoringServiceService
     def __init__(self):
         LOGGER.info('Init monitoringService')
 
-    def IncludeKpi(self, request, context):
-        # receives monitoring.KpiRequest returns monitoring.KpiId
-        LOGGER.info('IncludeKpi')
-        MONITORING_INCLUDEKPI_COUNTER.inc()
-        return monitoring_pb2.KpiId()
+    # CreateKpi (CreateKpiRequest) returns (KpiId) {}
+    def CreateKpi(self, request : monitoring_pb2.CreateKpiRequest, context) -> monitoring_pb2.KpiId :
+        LOGGER.info('CreateKpi')
+        # Here the code to create a sqlite query to crete a KPI and return a KpiID
+
+        # Change these lines by the KpiID assigned by the DB
+        kpi_id = monitoring_pb2.KpiId()
+        kpi_id.kpi_id.uuid = 'KPIID0000'
+
+        # Create KPI object with the request info and the KpiID
+        kpi = monitoring_pb2.Kpi()
+        kpi.device_id.device_id.uuid = request.device_id.device_id.uuid
+        kpi.kpi_sample_type = request.kpi_sample_type
+        kpi.kpi_id.kpi_id.uuid = kpi_id.kpi_id.uuid
+
+        return kpi_id
+
+    # rpc MonitorKpi (MonitorKpiRequest) returns (context.Empty) {}
+    def MonitorKpi ( self, request : monitoring_pb2.MonitorKpiRequest, context) -> context_pb2.Empty:
 
-    def MonitorKpi ( self, request, context):
-        # receives monitoring.KpiId returns monitoring.Kpi
         LOGGER.info('MonitorKpi')
-        return monitoring_pb2.Kpi()
+
+        # Creates the request to send to the device service
+        monitor_device_request = monitoring_pb2.MonitorDeviceKpiRequest()
+        kpi = get_Kpi(request.kpi_id)
+
+        monitor_device_request.kpi.kpi_id.kpi_id.uuid  = kpi.kpi_id.kpi_id.uuid
+
+        monitor_device_request.connexion_time_s = request.connexion_time_s
+        monitor_device_request.sample_rate_ms = request.sample_rate_ms
+
+        client = MonitoringClient(server=SERVER_ADDRESS, port=PORT)
+        client.MonitorDeviceKpi(monitor_device_request)
+
+        return context_pb2.Empty()
+
+    # rpc MonitorDeviceKpi(MonitorDeviceKpiRequest) returns(context.Empty) {}
+    def MonitorDeviceKpi ( self, request : monitoring_pb2.MonitorDeviceKpiRequest, context) -> context_pb2.Empty:
+
+        # Some code device to perform its actions
+
+        LOGGER.info('MonitorDeviceKpi')
+        return context_pb2.Empty()
+
+    # rpc IncludeKpi(IncludeKpiRequest)  returns(context.Empty)    {}
+    def IncludeKpi(self, request : monitoring_pb2.IncludeKpiRequest, context) -> context_pb2.Empty:
+
+        LOGGER.info('IncludeKpi')
+        return context_pb2.Empty()
+
 
     def GetStreamKpi ( self, request, context):
         # receives monitoring.KpiId returns stream monitoring.Kpi
@@ -81,6 +125,13 @@ def start_server(address='[::]', port=PORT, max_workers=10):
 def stop_server(serverGRPC, grace_period=0):
     serverGRPC.stop(grace_period)
 
+def get_Kpi(kpiId):
+    LOGGER.info('getting Kpi by KpyID')
+    # Change these lines with the correct ones after DB query
+    kpi = monitoring_pb2.Kpi()
+    kpi.kpi_id.kpi_id.uuid = kpiId.kpi_id.uuid
+    return kpi
+
 if __name__ == '__main__':
     LOGGER.info('initializing monitoringService')
     port = os.environ.get('PORT', str(PORT))
diff --git a/src/monitoring/tests/test_monitoring.py b/src/monitoring/tests/test_monitoring.py
index c45a007fea9dded9b17bd28fe89dbfdafc864a3d..9308697f343c59caa1d6c8df6e2832f03fcd4ebd 100644
--- a/src/monitoring/tests/test_monitoring.py
+++ b/src/monitoring/tests/test_monitoring.py
@@ -33,7 +33,6 @@ def monitoring_service():
     LOGGER.info('Terminating MonitoringService...')
     stop_server(server)
 
-
 # This fixture will be requested by test cases and last during testing session.
 # The client requires the server, so client fixture has the server as dependency.
 @pytest.fixture(scope='session')
@@ -64,37 +63,71 @@ def kpi_id():
     return kpi_id
 
 @pytest.fixture(scope='session')
-def kpi_request():
+def create_kpi_request():
     LOGGER.warning('test_include_kpi begin')
 
-    kpi_request = monitoring_pb2.KpiRequest()
-    kpi_request.device_id.device_id.uuid = 'DEV1'  # pylint: disable=maybe-no-member
-    kpi_request.kpiDescription = 'KPI Description'
-    kpi_request.kpi_sample_type = monitoring_pb2.KpiSampleType.PACKETS_TRANSMITTED
+    create_kpi_request = monitoring_pb2.CreateKpiRequest()
+    create_kpi_request.device_id.device_id.uuid = 'DEV1'  # pylint: disable=maybe-no-member
+    create_kpi_request.kpiDescription = 'KPI Description'
+    create_kpi_request.kpi_sample_type = monitoring_pb2.KpiSampleType.PACKETS_TRANSMITTED
+
+    return create_kpi_request
+
+@pytest.fixture(scope='session')
+def monitor_kpi_request():
+    LOGGER.warning('test_monitor_kpi begin')
+
+    monitor_kpi_request = monitoring_pb2.MonitorKpiRequest()
+    monitor_kpi_request.kpi_id.kpi_id.uuid = 'KPIID0000'
+    monitor_kpi_request.connexion_time_s = 120
+    monitor_kpi_request.sample_rate_ms = 5
+
+    return monitor_kpi_request
 
-    return kpi_request
+@pytest.fixture(scope='session')
+def monitor_device_kpi_request():
+    LOGGER.warning('test_monitor_kpi begin')
+
+    monitor_device_kpi_request = monitoring_pb2.MonitorDeviceKpiRequest()
+    monitor_device_kpi_request.connexion_time_s = 120
+    monitor_device_kpi_request.sample_rate_ms = 5
+
+    return monitor_device_kpi_request
 
 ###########################
 # Tests Implementation
 ###########################
 
-# Test case that makes use of client fixture to test server's IncludeKpi method
-def test_include_kpi(monitoring_client,kpi_request):
+# Test case that makes use of client fixture to test server's CreateKpi method
+def test_create_kpi(monitoring_client,create_kpi_request):
     # make call to server
-    LOGGER.warning('test_include_kpi requesting')
-    response = monitoring_client.IncludeKpi(kpi_request)
+    LOGGER.warning('test_create_kpi requesting')
+    response = monitoring_client.CreateKpi(create_kpi_request)
     LOGGER.debug(str(response))
     assert isinstance(response, monitoring_pb2.KpiId)
 
-# You can add as many tests as you want. Just copy the "def test_include_kpi(monitoring_client):" and implement
-# appropriate tests. monitoring_client and monitoring_service fixtures and their connection are reused along tests.
-
 # Test case that makes use of client fixture to test server's MonitorKpi method
-def test_monitor_kpi(monitoring_client,kpi_id):
+def test_monitor_kpi(monitoring_client,monitor_kpi_request):
     LOGGER.warning('test_monitor_kpi begin')
-    response = monitoring_client.MonitorKpi(kpi_id)
+    response = monitoring_client.MonitorKpi(monitor_kpi_request)
     LOGGER.debug(str(response))
-    assert isinstance(response, monitoring_pb2.Kpi)
+    assert isinstance(response, context_pb2.Empty)
+
+# Test case that makes use of client fixture to test server's MonitorDeviceKpi method
+def test_monitor_device_kpi(monitoring_client,monitor_device_kpi_request):
+    LOGGER.warning('test_monitor_device_kpi begin')
+    response = monitoring_client.MonitorDeviceKpi(monitor_device_kpi_request)
+    LOGGER.debug(str(response))
+    assert isinstance(response, context_pb2.Empty)
+
+# Test case that makes use of client fixture to test server's IncludeKpi method
+def test_include_kpi(monitoring_client,kpi_request):
+    # make call to server
+    LOGGER.warning('test_include_kpi requesting')
+    response = monitoring_client.IncludeKpi(kpi_request)
+    LOGGER.debug(str(response))
+    assert isinstance(response, context_pb2.Empty)
+
 
 # Test case that makes use of client fixture to test server's GetStreamKpi method
 def test_getstream_kpi(monitoring_client,kpi):