diff --git a/src/forecaster/service/ForecasterServiceServicerImpl.py b/src/forecaster/service/ForecasterServiceServicerImpl.py
index 138986a440c1b051aae458ca136b08e3b4c3b4d9..75315f0adb2d3310e927b40cce76da2012700202 100644
--- a/src/forecaster/service/ForecasterServiceServicerImpl.py
+++ b/src/forecaster/service/ForecasterServiceServicerImpl.py
@@ -12,8 +12,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from typing import Dict, List
 import grpc, logging
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
+from common.method_wrappers.ServiceExceptions import NotFoundException
+from common.proto.context_pb2 import LinkAttributes, LinkId
 from common.proto.forecaster_pb2 import (
     ForecastLinkCapacityReply, ForecastLinkCapacityRequest,
     ForecastTopologyCapacityReply, ForecastTopologyCapacityRequest
@@ -49,6 +52,11 @@ class ForecasterServiceServicerImpl(ForecasterServiceServicer):
         history_window_seconds = FORECAST_TO_HISTORY_RATIO * forecast_window_seconds
 
         link_id = request.link_id
+
+        context_client = ContextClient()
+        link = get_link(context_client, link_id.link_uuid.uuid)
+        if link is None: raise NotFoundException('Link', link_id.link_uuid.uuid)
+
         kpi_id_map = self._kpi_manager.get_kpi_ids_from_link_ids([link_id])
         kpi_to_link_ids = {
             link_id : kpi_id
@@ -62,11 +70,8 @@ class ForecasterServiceServicerImpl(ForecasterServiceServicer):
         df_historical_data = self._kpi_manager.get_kpi_id_samples([kpi_id], start_timestamp, end_timestamp)
         forecast_used_capacity_gbps = compute_forecast(df_historical_data, kpi_id)
 
-        context_client = ContextClient()
-        link = get_link(context_client, link_id.link_uuid.uuid)
-
         reply = ForecastLinkCapacityReply()
-        reply.link_id.CopyFrom(link_id)
+        reply.link_id.CopyFrom(link_id) # pylint: disable=no-member
         reply.total_capacity_gbps         = link.attributes.total_capacity_gbps
         reply.current_used_capacity_gbps  = link.attributes.used_capacity_gbps
         reply.forecast_used_capacity_gbps = forecast_used_capacity_gbps
@@ -86,12 +91,15 @@ class ForecasterServiceServicerImpl(ForecasterServiceServicer):
         topology_uuid = request.topology_id.topology_uuid.uuid
         context_client = ContextClient()
         topology_details = get_topology_details(context_client, topology_uuid, context_uuid=context_uuid)
+        if topology_details is None:
+            topology_uuid = '{:s}/{:s}'.format(context_uuid, topology_uuid)
+            raise NotFoundException('Topology', topology_uuid)
 
-        link_ids = list()
-        link_capacities = dict()
+        link_ids        : List[LinkId]              = list()
+        link_capacities : Dict[str, LinkAttributes] = dict()
         for link in topology_details.links:
             link_ids.append(link.link_id)
-            link_capacities[link.link_id] = link.attributes
+            link_capacities[link.link_id.link_uuid.uuid] = link.attributes
 
         kpi_id_map = self._kpi_manager.get_kpi_ids_from_link_ids(link_ids)
         kpi_to_link_ids = {
@@ -109,7 +117,7 @@ class ForecasterServiceServicerImpl(ForecasterServiceServicer):
         for link_id, kpi_id in kpi_to_link_ids.items():
             link_attributes = link_capacities[link_id]
             forecast_used_capacity_gbps = compute_forecast(df_historical_data, kpi_id)
-            link_capacity : ForecastLinkCapacityReply = reply.link_capacities.add()
+            link_capacity : ForecastLinkCapacityReply = reply.link_capacities.add() # pylint: disable=no-member
             link_capacity.link_id.CopyFrom(link_id)
             link_capacity.total_capacity_gbps         = link_attributes.total_capacity_gbps
             link_capacity.current_used_capacity_gbps  = link_attributes.used_capacity_gbps
diff --git a/src/forecaster/service/KpiManager.py b/src/forecaster/service/KpiManager.py
index 353ac893fd4ca233e7cfb713b20646bc54a12b8e..5b1895f0b52e44cb1b55e2a50a936cca1f7d7088 100644
--- a/src/forecaster/service/KpiManager.py
+++ b/src/forecaster/service/KpiManager.py
@@ -15,7 +15,6 @@
 import pandas
 from typing import Dict, List, Tuple
 from common.proto.context_pb2 import Empty, LinkId
-from common.proto.kpi_sample_types_pb2 import KpiSampleType
 from common.proto.monitoring_pb2 import KpiId, KpiQuery
 from monitoring.client.MonitoringClient import MonitoringClient
 
@@ -25,21 +24,21 @@ class KpiManager:
 
     def get_kpi_ids_from_link_ids(
         self, link_ids : List[LinkId]
-    ) -> Dict[Tuple[LinkId, int], KpiId]:
+    ) -> Dict[Tuple[str, int], KpiId]:
         link_uuids = {link_id.link_uuid.uuid for link_id in link_ids}
         kpi_descriptors = self._monitoring_client.GetKpiDescriptorList(Empty())
-        kpi_ids : Dict[Tuple[LinkId, int], KpiId] = {
-            (kpi_descriptor.link_id, kpi_descriptor.kpi_sample_type) : kpi_descriptor.kpi_id
-            for kpi_descriptor in kpi_descriptors
+        kpi_ids : Dict[Tuple[str, int], KpiId] = {
+            (kpi_descriptor.link_id.link_uuid.uuid, kpi_descriptor.kpi_sample_type) : kpi_descriptor.kpi_id
+            for kpi_descriptor in kpi_descriptors.kpi_descriptor_list
             if kpi_descriptor.link_id.link_uuid.uuid in link_uuids
         }
         return kpi_ids
 
     def get_kpi_id_samples(
-        self, kpi_ids : List[KpiId], start_timestamp : float, end_timestamp : float
+        self, kpi_uuids : List[str], start_timestamp : float, end_timestamp : float
     ) -> pandas.DataFrame:
         kpi_query = KpiQuery()
-        kpi_query.kpi_ids.extend(kpi_ids)                       # pylint: disable=no-member
+        for kpi_uuid in kpi_uuids: kpi_query.kpi_ids.add().kpi_id.uuid = kpi_uuid
         kpi_query.start_timestamp.timestamp = start_timestamp   # pylint: disable=no-member
         kpi_query.end_timestamp.timestamp   = end_timestamp     # pylint: disable=no-member
         raw_kpi_table = self._monitoring_client.QueryKpiData(kpi_query)
diff --git a/src/forecaster/service/TODO.txt b/src/forecaster/service/TODO.txt
index e1c8532026f8e35ccbbe307000e380b22b9d103e..9cc1222198c9e0156e3039252bc33ba232a2b51d 100644
--- a/src/forecaster/service/TODO.txt
+++ b/src/forecaster/service/TODO.txt
@@ -3,13 +3,27 @@ Use a smaller network:
 INFO     forecaster.tests.Tools:Tools.py:75 Discovering Devices and Links...
 INFO     forecaster.tests.Tools:Tools.py:104   Found 22 devices and 462 links...
 
-ERROR    forecaster.service.ForecasterServiceServicerImpl:Decorator.py:233 ForecastTopologyCapacity exception
+ERROR    grpc._server:_server.py:453 Exception calling application: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 Traceback (most recent call last):
-  File "/home/tfs/tfs-ctrl/src/common/method_wrappers/Decorator.py", line 220, in inner_wrapper
-    reply = func(self, request, grpc_context)
-  File "/home/tfs/tfs-ctrl/src/forecaster/service/ForecasterServiceServicerImpl.py", line 94, in ForecastTopologyCapacity
-    link_capacities[link.link_id] = link.attributes
-TypeError: unhashable type: 'LinkId'
+  File "/home/tfs/.pyenv/versions/3.9.13/envs/tfs/lib/python3.9/site-packages/grpc/_server.py", line 443, in _call_behavior
+    response_or_iterator = behavior(argument, context)
+  File "/home/tfs/tfs-ctrl/src/common/tests/MockServicerImpl_Monitoring.py", line 99, in QueryKpiData
+    df_samples = self.ts_db.filter(kpi_uuids, start_timestamp=start_timestamp, end_timestamp=end_timestamp)
+  File "/home/tfs/tfs-ctrl/src/common/tests/InMemoryTimeSeriesDatabase.py", line 30, in filter
+    if len(kpi_uuids) > 0: data = data[data.kpi_uuid in kpi_uuids]
+  File "/home/tfs/.pyenv/versions/3.9.13/envs/tfs/lib/python3.9/site-packages/pandas/core/generic.py", line 1527, in __nonzero__
+    raise ValueError(
+ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
+
+
+Seems mock_context does not add device and link ids to the topology
+    def test_forecast_link(
+        context_client : ContextClient,
+        forecaster_client : ForecasterClient,
+    ):  # pylint: disable=redefined-outer-name
+        topology = context_client.GetTopology(ADMIN_TOPOLOGY_ID)
+>       link_id = topology.link_ids[0]
+E       IndexError: list index (0) out of range
 
 
 
diff --git a/src/forecaster/tests/Tools.py b/src/forecaster/tests/Tools.py
index 026a02035a2161dbfdce08a475bfd136108bf3f9..5815112b4449d808d52725994887e56216ccbdca 100644
--- a/src/forecaster/tests/Tools.py
+++ b/src/forecaster/tests/Tools.py
@@ -45,7 +45,7 @@ def read_csv(csv_file : str) -> pandas.DataFrame:
     LOGGER.info('  DONE')
 
     LOGGER.info('Parsing and Adapting columns...')
-    if 'dataset.csv' in csv_file:
+    if 'dataset.csv' in csv_file or 'dataset-short.csv' in csv_file:
         df.rename(columns={'linkid': 'link_id', 'ds': 'timestamp', 'y': 'used_capacity_gbps'}, inplace=True)
         df[['source', 'destination']] = df['link_id'].str.split('_', expand=True)
     elif 'dataset2.csv' in csv_file:
@@ -94,7 +94,7 @@ def compose_descriptors(df : pandas.DataFrame) -> Dict:
         if link_uuid not in links:
             total_capacity_gbps = df[df.link_id==link_uuid]['used_capacity_gbps'].max()
             total_capacity_gbps = math.ceil(total_capacity_gbps / 100) * 100 # round up in steps of 100
-            used_capacity_gbps  = df[df.link_id==link_uuid]['used_capacity_gbps'].tail(1)
+            used_capacity_gbps  = df[df.link_id==link_uuid].used_capacity_gbps.iat[-1] # get last value
             links[link_uuid] = {
                 'id': link_uuid,
                 'src_dev': src_device_uuid, 'src_port': dst_device_uuid,
diff --git a/src/forecaster/tests/data/dataset-short.csv b/src/forecaster/tests/data/dataset-short.csv
new file mode 100644
index 0000000000000000000000000000000000000000..2b38f29c0d5337f4faea99bd5ef35f5c60e4ff1f
--- /dev/null
+++ b/src/forecaster/tests/data/dataset-short.csv
@@ -0,0 +1,19 @@
+"linkid","ds","y"
+"at1.at_be1.be","2005-07-29 11:30:00",20.254615
+"at1.at_ch1.ch","2005-07-29 11:30:00",54.915569
+"at1.at_de1.de","2005-07-29 11:30:00",35.440825
+"at1.at_es1.es","2005-07-29 11:30:00",0.014227
+"at1.at_fr1.fr","2005-07-29 11:30:00",1.371593
+"at1.at_gr1.gr","2005-07-29 11:30:00",224.449018
+"at1.at_hr1.hr","2005-07-29 11:30:00",652.82534
+"at1.at_hu1.hu","2005-07-29 11:30:00",1887.08947
+"at1.at_ie1.ie","2005-07-29 11:30:00",2.878366
+"at1.at_il1.il","2005-07-29 11:30:00",379.481098
+"at1.at_it1.it","2005-07-29 11:30:00",92.497118
+"at1.at_lu1.lu","2005-07-29 11:30:00",0.163239
+"at1.at_nl1.nl","2005-07-29 11:30:00",6.314097
+"at1.at_ny1.ny","2005-07-29 11:30:00",2.282933
+"at1.at_pt1.pt","2005-07-29 11:30:00",0.132256
+"at1.at_se1.se","2005-07-29 11:30:00",1425.471977
+"at1.at_si1.si","2005-07-29 11:30:00",1822.904739
+"at1.at_uk1.uk","2005-07-29 11:30:00",1.661015
diff --git a/src/forecaster/tests/data/descriptor.json b/src/forecaster/tests/data/descriptor.json
new file mode 100644
index 0000000000000000000000000000000000000000..c3d60fb5e78bcdbdcde61e65bbf8c2fd148241f6
--- /dev/null
+++ b/src/forecaster/tests/data/descriptor.json
@@ -0,0 +1 @@
+{"dummy_mode": true, "contexts": [{"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_ids": [], "service_ids": [], "slice_ids": [], "name": "admin"}], "topologies": [{"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}, "device_ids": [], "link_ids": [], "name": "admin"}], "devices": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "it1.it"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "es1.es"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "pt1.pt"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "gr1.gr"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "ny1.ny"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "se1.se"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "hr1.hr"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "de1.de"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "ch1.ch"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "si1.si"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "lu1.lu"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "be1.be"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "uk1.uk"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "nl1.nl"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "il1.il"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "hu1.hu"}}, "endpoint_type": "copper"}, {"endpoint_id": {"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "ie1.ie"}}, "endpoint_type": "copper"}], "name": "at1.at"}, {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "be1.be"}, {"device_id": {"device_uuid": {"uuid": "se1.se"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "se1.se"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "se1.se"}, {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "pt1.pt"}, {"device_id": {"device_uuid": {"uuid": "ny1.ny"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "ny1.ny"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "ny1.ny"}, {"device_id": {"device_uuid": {"uuid": "nl1.nl"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "nl1.nl"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "nl1.nl"}, {"device_id": {"device_uuid": {"uuid": "lu1.lu"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "lu1.lu"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "lu1.lu"}, {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "it1.it"}, {"device_id": {"device_uuid": {"uuid": "il1.il"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "il1.il"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "il1.il"}, {"device_id": {"device_uuid": {"uuid": "ie1.ie"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "ie1.ie"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "ie1.ie"}, {"device_id": {"device_uuid": {"uuid": "hu1.hu"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "hu1.hu"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "hu1.hu"}, {"device_id": {"device_uuid": {"uuid": "hr1.hr"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "hr1.hr"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "hr1.hr"}, {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "gr1.gr"}, {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "fr1.fr"}, {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "es1.es"}, {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "de1.de"}, {"device_id": {"device_uuid": {"uuid": "ch1.ch"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "ch1.ch"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "ch1.ch"}, {"device_id": {"device_uuid": {"uuid": "si1.si"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "si1.si"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "si1.si"}, {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "device_type": "emu-packet-router", "device_config": {"config_rules": [{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"endpoints\": []}"}}]}, "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [{"endpoint_id": {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "at1.at"}}, "endpoint_type": "copper"}], "name": "uk1.uk"}], "links": [{"link_id": {"link_uuid": {"uuid": "at1.at_be1.be"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "be1.be"}}, {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_be1.be", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 20.254615}}, {"link_id": {"link_uuid": {"uuid": "at1.at_se1.se"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "se1.se"}}, {"device_id": {"device_uuid": {"uuid": "se1.se"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_se1.se", "attributes": {"total_capacity_gbps": 1500, "used_capacity_gbps": 1425.471977}}, {"link_id": {"link_uuid": {"uuid": "at1.at_pt1.pt"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "pt1.pt"}}, {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_pt1.pt", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 0.132256}}, {"link_id": {"link_uuid": {"uuid": "at1.at_ny1.ny"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "ny1.ny"}}, {"device_id": {"device_uuid": {"uuid": "ny1.ny"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_ny1.ny", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 2.282933}}, {"link_id": {"link_uuid": {"uuid": "at1.at_nl1.nl"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "nl1.nl"}}, {"device_id": {"device_uuid": {"uuid": "nl1.nl"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_nl1.nl", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 6.314097}}, {"link_id": {"link_uuid": {"uuid": "at1.at_lu1.lu"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "lu1.lu"}}, {"device_id": {"device_uuid": {"uuid": "lu1.lu"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_lu1.lu", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 0.163239}}, {"link_id": {"link_uuid": {"uuid": "at1.at_it1.it"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "it1.it"}}, {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_it1.it", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 92.497118}}, {"link_id": {"link_uuid": {"uuid": "at1.at_il1.il"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "il1.il"}}, {"device_id": {"device_uuid": {"uuid": "il1.il"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_il1.il", "attributes": {"total_capacity_gbps": 400, "used_capacity_gbps": 379.481098}}, {"link_id": {"link_uuid": {"uuid": "at1.at_ie1.ie"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "ie1.ie"}}, {"device_id": {"device_uuid": {"uuid": "ie1.ie"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_ie1.ie", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 2.878366}}, {"link_id": {"link_uuid": {"uuid": "at1.at_hu1.hu"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "hu1.hu"}}, {"device_id": {"device_uuid": {"uuid": "hu1.hu"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_hu1.hu", "attributes": {"total_capacity_gbps": 1900, "used_capacity_gbps": 1887.08947}}, {"link_id": {"link_uuid": {"uuid": "at1.at_hr1.hr"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "hr1.hr"}}, {"device_id": {"device_uuid": {"uuid": "hr1.hr"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_hr1.hr", "attributes": {"total_capacity_gbps": 700, "used_capacity_gbps": 652.82534}}, {"link_id": {"link_uuid": {"uuid": "at1.at_gr1.gr"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "gr1.gr"}}, {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_gr1.gr", "attributes": {"total_capacity_gbps": 300, "used_capacity_gbps": 224.449018}}, {"link_id": {"link_uuid": {"uuid": "at1.at_fr1.fr"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_fr1.fr", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 1.371593}}, {"link_id": {"link_uuid": {"uuid": "at1.at_es1.es"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "es1.es"}}, {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_es1.es", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 0.014227}}, {"link_id": {"link_uuid": {"uuid": "at1.at_de1.de"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "de1.de"}}, {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_de1.de", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 35.440825}}, {"link_id": {"link_uuid": {"uuid": "at1.at_ch1.ch"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "ch1.ch"}}, {"device_id": {"device_uuid": {"uuid": "ch1.ch"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_ch1.ch", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 54.915569}}, {"link_id": {"link_uuid": {"uuid": "at1.at_si1.si"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "si1.si"}}, {"device_id": {"device_uuid": {"uuid": "si1.si"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_si1.si", "attributes": {"total_capacity_gbps": 1900, "used_capacity_gbps": 1822.904739}}, {"link_id": {"link_uuid": {"uuid": "at1.at_uk1.uk"}}, "link_endpoint_ids": [{"device_id": {"device_uuid": {"uuid": "at1.at"}}, "endpoint_uuid": {"uuid": "uk1.uk"}}, {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "at1.at"}}], "name": "at1.at_uk1.uk", "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 1.661015}}]}
\ No newline at end of file
diff --git a/src/forecaster/tests/test_unitary.py b/src/forecaster/tests/test_unitary.py
index 0be9e5f06dc224667c5f4764ab47e0964d39f41f..eb952cfda4d3a804d5be1b106e20f7c5a2e45200 100644
--- a/src/forecaster/tests/test_unitary.py
+++ b/src/forecaster/tests/test_unitary.py
@@ -17,25 +17,32 @@ from typing import Dict, Tuple
 from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
 from common.proto.context_pb2 import ContextId, TopologyId
 from common.proto.forecaster_pb2 import ForecastLinkCapacityRequest, ForecastTopologyCapacityRequest
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.proto.monitoring_pb2 import KpiDescriptor
 from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario
+from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Topology import json_topology_id
 from context.client.ContextClient import ContextClient
 from forecaster.client.ForecasterClient import ForecasterClient
 from forecaster.tests.Tools import compose_descriptors, read_csv
-
+from monitoring.client.MonitoringClient import MonitoringClient
+from .MockService_Dependencies import MockService_Dependencies
 from .PrepareTestScenario import ( # pylint: disable=unused-import
     # be careful, order of symbols is important here!
     mock_service, forecaster_service, context_client, monitoring_client, forecaster_client)
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
+logging.getLogger('common.tests.MockServicerImpl_Context').setLevel(logging.INFO)
+logging.getLogger('context.client.ContextClient').setLevel(logging.INFO)
 
 JSON_ADMIN_CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_NAME)
 ADMIN_CONTEXT_ID = ContextId(**JSON_ADMIN_CONTEXT_ID)
 ADMIN_TOPOLOGY_ID = TopologyId(**json_topology_id(DEFAULT_TOPOLOGY_NAME, context_id=JSON_ADMIN_CONTEXT_ID))
 
-CSV_DATA_FILE = 'forecaster/tests/data/dataset.csv'
+CSV_DATA_FILE = 'forecaster/tests/data/dataset-short.csv'
+#CSV_DATA_FILE = 'forecaster/tests/data/dataset.csv'
 #CSV_DATA_FILE = 'forecaster/tests/data/dataset2.csv'
 DESC_DATS_FILE = 'forecaster/tests/data/descriptor.json'
 
@@ -48,10 +55,12 @@ def scenario() -> Tuple[pandas.DataFrame, Dict]:
     yield df, descriptors
 
 def test_prepare_environment(
-    context_client : ContextClient, # pylint: disable=redefined-outer-name
-    scenario : Tuple[pandas.DataFrame, Dict]
+    context_client : ContextClient,             # pylint: disable=redefined-outer-name
+    monitoring_client : MonitoringClient,       # pylint: disable=redefined-outer-name
+    mock_service : MockService_Dependencies,    # pylint: disable=redefined-outer-name
+    scenario : Tuple[pandas.DataFrame, Dict]    # pylint: disable=redefined-outer-name
 ) -> None:
-    _, descriptors = scenario
+    df, descriptors = scenario
 
     validate_empty_scenario(context_client)
     descriptor_loader = DescriptorLoader(descriptors=descriptors, context_client=context_client)
@@ -64,6 +73,20 @@ def test_prepare_environment(
     assert len(response.service_ids) == 0
     assert len(response.slice_ids) == 0
 
+    for link in descriptors['links']:
+        link_uuid = link['link_id']['link_uuid']['uuid']
+        kpi_descriptor = KpiDescriptor()
+        kpi_descriptor.kpi_id.kpi_id.uuid     = link_uuid   # pylint: disable=no-member
+        kpi_descriptor.kpi_description        = 'Used Capacity in Link: {:s}'.format(link_uuid)
+        kpi_descriptor.kpi_sample_type        = KpiSampleType.KPISAMPLETYPE_LINK_USED_CAPACITY_GBPS
+        kpi_descriptor.link_id.link_uuid.uuid = link_uuid   # pylint: disable=no-member
+        monitoring_client.SetKpi(kpi_descriptor)
+
+    mock_service.monitoring_servicer.ts_db._data = df.rename(columns={
+        'link_id': 'kpi_uuid',
+        'used_capacity_gbps': 'value'
+    })
+
 def test_forecast_link(
     context_client : ContextClient,
     forecaster_client : ForecasterClient,
@@ -97,8 +120,8 @@ def test_forecast_topology(
         # TODO: validate forecasted values
 
 def test_cleanup_environment(
-    context_client : ContextClient, # pylint: disable=redefined-outer-name
-    scenario : Tuple[pandas.DataFrame, Dict]
+    context_client : ContextClient,             # pylint: disable=redefined-outer-name
+    scenario : Tuple[pandas.DataFrame, Dict]    # pylint: disable=redefined-outer-name
 ) -> None:
     _, descriptors = scenario