diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index a7775b50758fd9df7757f87b413c050667c90b32..20a50cea38b7421cbbe205043f28055c9d776944 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -35,6 +35,7 @@ class CoreMCODriver(Plugin):
     def application_started(self):
         workflow = self.application.workflow
         if self.application.evaluate:
+            ds_results = []
             for requested_ds in workflow.data_sources:
                 ds_bundle = self._find_data_source_bundle_by_name(
                     requested_ds.name)
@@ -42,7 +43,7 @@ class CoreMCODriver(Plugin):
                     ds_model = ds_bundle.create_model(requested_ds.model_data)
                     data_source = ds_bundle.create_data_source(
                         self.application, ds_model)
-                    print(data_source.run())
+                    ds_results.append(data_source.run())
                 else:
                     raise Exception("Requested data source {} but don't know "
                                     "to find it.".format(requested_ds.name))
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py
index f01f35554a5d2530935e560d29f6afc8da06c568..75e1a936cc54c4784d9f3a06893ce143fcc12271 100644
--- a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py
+++ b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py
@@ -1,5 +1,7 @@
 import csv
+import numpy
 from force_bdss.data_sources.base_data_source import BaseDataSource
+from force_bdss.data_sources.data_source_result import DataSourceResult
 
 
 class CSVExtractorDataSource(BaseDataSource):
@@ -11,9 +13,12 @@ class CSVExtractorDataSource(BaseDataSource):
                     continue
 
                 if rowindex == self.model.row:
-                    return {
-                        self.model.cuba_type: row[self.model.column]
-                    }
+                    return DataSourceResult(
+                        originator=self,
+                        value_types=[self.model.cuba_type],
+                        values=numpy.array(
+                            row[self.model.column]).reshape(1, 1)
+                    )
 
                 return None
             return None
diff --git a/force_bdss/data_sources/base_data_source.py b/force_bdss/data_sources/base_data_source.py
index 49c114082a4ce68b0301f31e3f31e02959c8b06e..469ed8b902cc9d237139bf6b53ef6e2a952a20e8 100644
--- a/force_bdss/data_sources/base_data_source.py
+++ b/force_bdss/data_sources/base_data_source.py
@@ -12,5 +12,8 @@ class BaseDataSource(six.with_metaclass(abc.ABCMeta)):
     def name(self):
         return self.bundle.name
 
+    @abc.abstractmethod
     def run(self):
+        """Executes the data source evaluation/fetching and returns
+        the list of results as a DataSourceResult instance."""
         pass
diff --git a/force_bdss/data_sources/data_source_result.py b/force_bdss/data_sources/data_source_result.py
new file mode 100644
index 0000000000000000000000000000000000000000..b1208aec5ca1dc9217667c9009021344fd4be8c4
--- /dev/null
+++ b/force_bdss/data_sources/data_source_result.py
@@ -0,0 +1,19 @@
+from traits.api import HasTraits, Array, ArrayOrNone, List, String, Instance
+
+from .base_data_source import BaseDataSource
+
+
+class DataSourceResult(HasTraits):
+    """Represents the result of a simulator.
+    It contains the resulting cuba key, the associated uncertainty and the
+    originating simulator.
+    Difference between uncertainty and quality: uncertainty is a numerical
+    value of the value, as in the case of an experimental simulation.
+    quality is the level of accuracy of the (e.g. computational) method, as
+    the importance and reliability of that value. It should be an enumeration
+    value such as HIGH, MEDIUM, POOR"""
+    originator = Instance(BaseDataSource)
+    value_types = List(String)
+    values = Array(shape=(None, None))
+    accuracy = ArrayOrNone(shape=(None, None))
+    quality = ArrayOrNone(shape=(None, None))
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index cfc27054ea4f3f6acf0be5267e8bf9a3809d9881..4896c1b4d5714200a4b3d43b45cae26a344c2fc6 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -2,3 +2,4 @@ envisage==4.6.0
 click==6.7
 six==1.10.0
 stevedore==1.24.0
+numpy==1.12.0
diff --git a/setup.py b/setup.py
index 3666512919b74d4c0e96fd001e4896f74d599b64..ee92923801b09e5ccf799726e3df464af61f7d1a 100644
--- a/setup.py
+++ b/setup.py
@@ -21,6 +21,7 @@ setup(
         "envisage >= 4.6.0",
         "click >= 6.7",
         "stevedore >= 1.24.0",
-        "six >= 1.10.0"
+        "six >= 1.10.0",
+        "numpy >= 1.12.0",
     ]
 )