diff --git a/proto/monitoring.proto b/proto/monitoring.proto
index 270ed9ccf6dcbed2e27d3c5d86ac8f0eaa1c3551..027dcb0227c9b49cf091213bd42f101374eb3bc2 100644
--- a/proto/monitoring.proto
+++ b/proto/monitoring.proto
@@ -59,13 +59,11 @@ message MonitorKpiRequest {
 }
 
 message KpiQuery {
-  repeated KpiId    kpi_id              = 1;
+  repeated KpiId    kpi_ids              = 1;
   float             monitoring_window_s = 2;
-  float             sampling_rate_s     = 3;
-  uint32            last_n_samples      = 4;  // used when you want something like "get the last N many samples
-  context.Timestamp start_timestamp     = 5;  // used when you want something like "get the samples since X date/time"
-  context.Timestamp end_timestamp       = 6;  // used when you want something like "get the samples until X date/time"
-  // Pending add field to reflect Available Device Protocols
+  uint32            last_n_samples      = 3;  // used when you want something like "get the last N many samples
+  context.Timestamp start_timestamp     = 4;  // used when you want something like "get the samples since X date/time"
+  context.Timestamp end_timestamp       = 5;  // used when you want something like "get the samples until X date/time"
 }
 
 
@@ -75,12 +73,12 @@ message RawKpi { // cell
 }
 
 message RawKpiList { // column
-  KpiId           kpi_id        = 1;
-  repeated RawKpi raw_kpi_list  = 2;
+  KpiId           kpi_id    = 1;
+  repeated RawKpi raw_kpis  = 2;
 }
 
 message RawKpiTable { // table
-  repeated RawKpiList raw_kpi_table = 1;
+  repeated RawKpiList raw_kpi_lists = 1;
 }
 
 message KpiId {
diff --git a/src/monitoring/service/MetricsDBTools.py b/src/monitoring/service/MetricsDBTools.py
index aa374b340afe3f3e526f725330ce1c61a543c73a..5848ce54520e26cd4f748589d7fd2f3da9acf401 100644
--- a/src/monitoring/service/MetricsDBTools.py
+++ b/src/monitoring/service/MetricsDBTools.py
@@ -23,7 +23,7 @@ import datetime
 from common.tools.timestamp.Converters import timestamp_float_to_string, timestamp_utcnow_to_float
 import psycopg2
 
-LOGGER = logging.getLogger(__name__)
+from monitoring.service.MonitoringServiceServicerImpl import LOGGER
 
 
 class MetricsDB():
@@ -174,11 +174,33 @@ class MetricsDB():
                 if connection:
                     connection.close()
 
-    def get_raw_kpi_list(self, kpi_id, monitoring_window_s,sampling_rate_s, last_n_samples, start_timestamp, end_timestamp):
+    def get_raw_kpi_list(self, kpi_id, monitoring_window_s, last_n_samples, start_timestamp, end_timestamp):
         try:
-            end_date = timestamp_utcnow_to_float() - self.commit_lag_ms / 1000
-            start_date = end_date - monitoring_window_s
-            query = f"SELECT timestamp, kpi_value FROM {self.table} WHERE kpi_id = '{kpi_id}' AND (timestamp BETWEEN '{timestamp_float_to_string(start_date)}' AND '{timestamp_float_to_string(end_date)}')"
+            query_root  = f"SELECT timestamp, kpi_value FROM {self.table} WHERE kpi_id = '{kpi_id}' "
+            query       = query_root
+            start_date  = float()
+            end_date    = float()
+            if last_n_samples:
+                query = query + f"ORDER BY timestamp DESC limit {last_n_samples}"
+            elif monitoring_window_s or start_timestamp or end_timestamp:
+                if start_timestamp and end_timestamp:
+                    start_date  = start_timestamp
+                    end_date    = end_timestamp
+                elif monitoring_window_s:
+                    if start_timestamp and not end_timestamp:
+                        start_date  = start_timestamp
+                        end_date    = start_date + monitoring_window_s
+                    elif end_timestamp and not start_timestamp:
+                        end_date    = end_timestamp
+                        start_date  = end_date - monitoring_window_s
+                    elif not start_timestamp and not end_timestamp:
+                        end_date    = timestamp_utcnow_to_float()
+                        start_date  = end_date - monitoring_window_s
+                query = query + f"AND (timestamp BETWEEN '{timestamp_float_to_string(start_date)}' AND '{timestamp_float_to_string(end_date)}')"
+            else:
+                LOGGER.debug(f"Wrong parameters settings")
+
+            LOGGER.debug(query)
 
             if self.postgre:
                 kpi_list = self.run_query_postgre(query)
@@ -186,7 +208,6 @@ class MetricsDB():
             else:
                 kpi_list = self.run_query(query)
                 LOGGER.debug(f"kpi_list influx: {kpi_list}")
-
             if kpi_list:
                 LOGGER.debug(f"New data received for subscription to KPI {kpi_id}")
                 return kpi_list
@@ -200,6 +221,7 @@ class MetricsDB():
             end_date = timestamp_utcnow_to_float() - self.commit_lag_ms / 1000
             start_date = end_date - sampling_interval_s
             query = f"SELECT kpi_id, timestamp, kpi_value FROM {self.table} WHERE kpi_id = '{kpi_id}' AND (timestamp BETWEEN '{timestamp_float_to_string(start_date)}' AND '{timestamp_float_to_string(end_date)}')"
+            LOGGER.debug(query)
             if self.postgre:
                 kpi_list = self.run_query_postgre(query)
                 LOGGER.debug(f"kpi_list postgre: {kpi_list}")
diff --git a/src/monitoring/service/MonitoringServiceServicerImpl.py b/src/monitoring/service/MonitoringServiceServicerImpl.py
index e12d7ca7358d3a9c4f495b0c58da8bda139d56c9..2d7d01e3e8812cc836ed737e3c9ff5130eab2da5 100644
--- a/src/monitoring/service/MonitoringServiceServicerImpl.py
+++ b/src/monitoring/service/MonitoringServiceServicerImpl.py
@@ -251,9 +251,8 @@ class MonitoringServiceServicerImpl(MonitoringServiceServicer):
 
             LOGGER.debug(str(request))
 
-            kpi_id_list             = request.kpi_id
+            kpi_id_list             = request.kpi_ids
             monitoring_window_s     = request.monitoring_window_s
-            sampling_rate_s         = request.sampling_rate_s
             last_n_samples          = request.last_n_samples
             start_timestamp         = request.start_timestamp.timestamp
             end_timestamp           = request.end_timestamp.timestamp
@@ -268,7 +267,7 @@ class MonitoringServiceServicerImpl(MonitoringServiceServicer):
                     break
                 else:
                     # Execute query per Kpi_id and introduce their kpi_list in the table
-                    kpi_list = self.metrics_db.get_raw_kpi_list(kpi_id,monitoring_window_s,sampling_rate_s,last_n_samples,start_timestamp,end_timestamp)
+                    kpi_list = self.metrics_db.get_raw_kpi_list(kpi_id,monitoring_window_s,last_n_samples,start_timestamp,end_timestamp)
                     raw_kpi_list = RawKpiList()
                     raw_kpi_list.kpi_id.kpi_id.uuid = kpi_id
 
@@ -279,11 +278,11 @@ class MonitoringServiceServicerImpl(MonitoringServiceServicer):
                     else:
                         for item in kpi_list:
                             raw_kpi = RawKpi()
-                            raw_kpi.timestamp.timestamp = timestamp_string_to_float(item[1])
-                            raw_kpi.kpi_value.floatVal  = item[2]
-                            raw_kpi_list.raw_kpi_list.append(raw_kpi)
+                            raw_kpi.timestamp.timestamp = timestamp_string_to_float(item[0])
+                            raw_kpi.kpi_value.floatVal  = item[1]
+                            raw_kpi_list.raw_kpis.append(raw_kpi)
 
-                    raw_kpi_table.raw_kpi_table.append(raw_kpi_list)
+                    raw_kpi_table.raw_kpi_lists.append(raw_kpi_list)
 
             return raw_kpi_table
         except ServiceException as e:
diff --git a/src/monitoring/tests/Messages.py b/src/monitoring/tests/Messages.py
index a2fc421ddc82fb79c060b927f6ddc762a4c4efa0..f15cb5ec2c1d14ed95731cd37e54cb714b29e8b7 100644
--- a/src/monitoring/tests/Messages.py
+++ b/src/monitoring/tests/Messages.py
@@ -22,15 +22,15 @@ def kpi_id():
     _kpi_id.kpi_id.uuid = str(1)            # pylint: disable=maybe-no-member
     return _kpi_id
 
-def create_kpi_request():
-    _create_kpi_request                                = monitoring_pb2.KpiDescriptor()
-    _create_kpi_request.kpi_description                = 'KPI Description Test'
-    _create_kpi_request.kpi_sample_type                = KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED
-    _create_kpi_request.device_id.device_uuid.uuid     = 'DEV1'     # pylint: disable=maybe-no-member
-    _create_kpi_request.service_id.service_uuid.uuid   = 'SERV1'    # pylint: disable=maybe-no-member
-    _create_kpi_request.slice_id.slice_uuid.uuid       = 'SLC1'  # pylint: disable=maybe-no-member
-    _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END1'     # pylint: disable=maybe-no-member
-    _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1'  # pylint: disable=maybe-no-member
+def create_kpi_request(kpi_id_str):
+    _create_kpi_request                                     = monitoring_pb2.KpiDescriptor()
+    _create_kpi_request.kpi_description                     = 'KPI Description Test'
+    _create_kpi_request.kpi_sample_type                     = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
+    _create_kpi_request.device_id.device_uuid.uuid          = 'DEV' + str(kpi_id_str)
+    _create_kpi_request.service_id.service_uuid.uuid        = 'SERV' + str(kpi_id_str)
+    _create_kpi_request.slice_id.slice_uuid.uuid            = 'SLC' + str(kpi_id_str)
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid      = 'END' + str(kpi_id_str)
+    _create_kpi_request.connection_id.connection_uuid.uuid  = 'CON' + str(kpi_id_str)
     return _create_kpi_request
 
 def create_kpi_request_b():
@@ -77,20 +77,18 @@ def kpi_descriptor_list():
 def kpi_query(kpi_id_list):
     _kpi_query = monitoring_pb2.KpiQuery()
 
-    _kpi_query.kpi_id.extend(kpi_id_list)
-    _kpi_query.monitoring_window_s          = 20
-    _kpi_query.sampling_rate_s              = 3
-    # _kpi_query.last_n_samples               = 10
-    _kpi_query.start_timestamp.timestamp    = timestamp_utcnow_to_float() - 20
+    _kpi_query.kpi_ids.extend(kpi_id_list)
+    # _kpi_query.monitoring_window_s          = 10
+    # _kpi_query.last_n_samples               = 2
+    _kpi_query.start_timestamp.timestamp    = timestamp_utcnow_to_float() - 10
     _kpi_query.end_timestamp.timestamp      = timestamp_utcnow_to_float()
 
-
     return _kpi_query
 
 def subs_descriptor(kpi_id):
     _subs_descriptor = monitoring_pb2.SubsDescriptor()
 
-    sampling_duration_s = 20
+    sampling_duration_s = 10
     sampling_interval_s = 3
     real_start_time     = timestamp_utcnow_to_float()
     start_timestamp     = real_start_time