diff --git a/doc/source/api/force_bdss.core.rst b/doc/source/api/force_bdss.core.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cea914b156f4b8b33dfae0873af5c7717b4459c4
--- /dev/null
+++ b/doc/source/api/force_bdss.core.rst
@@ -0,0 +1,29 @@
+force_bdss.core package
+=======================
+
+Subpackages
+-----------
+
+.. toctree::
+
+    force_bdss.core.tests
+
+Submodules
+----------
+
+force_bdss.core.data_value module
+---------------------------------
+
+.. automodule:: force_bdss.core.data_value
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+Module contents
+---------------
+
+.. automodule:: force_bdss.core
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/api/force_bdss.core.tests.rst b/doc/source/api/force_bdss.core.tests.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f5a4f039275b34034015e50ea5cbefd3668b53cd
--- /dev/null
+++ b/doc/source/api/force_bdss.core.tests.rst
@@ -0,0 +1,22 @@
+force_bdss.core.tests package
+=============================
+
+Submodules
+----------
+
+force_bdss.core.tests.test_data_value module
+--------------------------------------------
+
+.. automodule:: force_bdss.core.tests.test_data_value
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+Module contents
+---------------
+
+.. automodule:: force_bdss.core.tests
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/doc/source/api/force_bdss.data_sources.rst b/doc/source/api/force_bdss.data_sources.rst
index 7df2d7d82a4fc847ade8719b3c338e4fb4c3b04c..0d7330fb60412b83b9723f41098044db8536f0d3 100644
--- a/doc/source/api/force_bdss.data_sources.rst
+++ b/doc/source/api/force_bdss.data_sources.rst
@@ -35,22 +35,6 @@ force_bdss.data_sources.base_data_source_model module
     :undoc-members:
     :show-inheritance:
 
-force_bdss.data_sources.data_source_parameters module
------------------------------------------------------
-
-.. automodule:: force_bdss.data_sources.data_source_parameters
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-force_bdss.data_sources.data_source_result module
--------------------------------------------------
-
-.. automodule:: force_bdss.data_sources.data_source_result
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
 force_bdss.data_sources.i_data_source_bundle module
 ---------------------------------------------------
 
diff --git a/doc/source/api/force_bdss.kpi.rst b/doc/source/api/force_bdss.kpi.rst
index b90b1b5f07e1e7e428de41c12bfe88cb58abd4c6..55b751599bfeada834e14115e197c0aef1f07799 100644
--- a/doc/source/api/force_bdss.kpi.rst
+++ b/doc/source/api/force_bdss.kpi.rst
@@ -43,14 +43,6 @@ force_bdss.kpi.i_kpi_calculator_bundle module
     :undoc-members:
     :show-inheritance:
 
-force_bdss.kpi.kpi_calculator_result module
--------------------------------------------
-
-.. automodule:: force_bdss.kpi.kpi_calculator_result
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
 
 Module contents
 ---------------
diff --git a/doc/source/api/force_bdss.rst b/doc/source/api/force_bdss.rst
index e558a1c921e3a3b557f6ccb205fb8f9349659589..701918cf76cd195ac1a42069d1023550e85a91d9 100644
--- a/doc/source/api/force_bdss.rst
+++ b/doc/source/api/force_bdss.rst
@@ -7,6 +7,7 @@ Subpackages
 .. toctree::
 
     force_bdss.cli
+    force_bdss.core
     force_bdss.core_plugins
     force_bdss.data_sources
     force_bdss.io
diff --git a/force_bdss/api.py b/force_bdss/api.py
index 5c71f3d71284e4124ab530be23f6f5c17dcbb576..7480b1b5ec447f3978df3421800be225de92f510 100644
--- a/force_bdss/api.py
+++ b/force_bdss/api.py
@@ -1,15 +1,13 @@
 from .base_extension_plugin import BaseExtensionPlugin  # noqa
 from .ids import bundle_id, plugin_id  # noqa
+from .core.data_value import DataValue  # noqa
 
 from .data_sources.base_data_source_model import BaseDataSourceModel  # noqa
-from .data_sources.data_source_result import DataSourceResult  # noqa
-from .data_sources.data_source_parameters import DataSourceParameters  # noqa
 from .data_sources.base_data_source import BaseDataSource  # noqa
 from .data_sources.base_data_source_bundle import BaseDataSourceBundle  # noqa
 from .data_sources.i_data_source_bundle import IDataSourceBundle  # noqa
 
 from .kpi.base_kpi_calculator import BaseKPICalculator  # noqa
-from .kpi.kpi_calculator_result import KPICalculatorResult  # noqa
 from .kpi.base_kpi_calculator_model import BaseKPICalculatorModel  # noqa
 from .kpi.base_kpi_calculator_bundle import BaseKPICalculatorBundle  # noqa
 from .kpi.i_kpi_calculator_bundle import IKPICalculatorBundle  # noqa
diff --git a/force_bdss/core/__init__.py b/force_bdss/core/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core/data_value.py b/force_bdss/core/data_value.py
new file mode 100644
index 0000000000000000000000000000000000000000..c1240531bf37065964e7fc1af5c47cf4dbd667b2
--- /dev/null
+++ b/force_bdss/core/data_value.py
@@ -0,0 +1,34 @@
+from traits.api import HasStrictTraits, Any, String, Enum
+
+
+class DataValue(HasStrictTraits):
+    """Contains in-transit data between the various components (MCO/DS/KPI).
+    Each DataValue instance holds information about the CUBA type it
+    contains, the name as assigned by the user, and the value (which can be
+    anything.
+    """
+    #: The CUBA type associated to the value.
+    type = String()
+
+    #: The user-defined name associated to the value.
+    name = String()
+
+    #: The value.
+    value = Any()
+
+    # The numerical accuracy of the value.
+    accuracy = Any()
+
+    #: A flag for the quality of the data.
+    quality = Enum("AVERAGE", "POOR", "GOOD")
+
+    def __str__(self):
+
+        s = "{} {} = {}".format(
+            str(self.type), str(self.name), str(self.value))
+
+        if self.accuracy is not None:
+            s += " +/- {}".format(str(self.accuracy))
+
+        s += " ({})".format(str(self.quality))
+        return s
diff --git a/force_bdss/core/tests/__init__.py b/force_bdss/core/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core/tests/test_data_value.py b/force_bdss/core/tests/test_data_value.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ee866c21a97f1729afe325912a1ffb19fbe30cd
--- /dev/null
+++ b/force_bdss/core/tests/test_data_value.py
@@ -0,0 +1,22 @@
+import unittest
+
+from force_bdss.core.data_value import DataValue
+
+
+class TestDataValue(unittest.TestCase):
+    def test_initialization(self):
+        dv = DataValue()
+        self.assertEqual(dv.type, "")
+        self.assertEqual(dv.value, None)
+        self.assertEqual(dv.accuracy, None)
+        self.assertEqual(dv.quality, "AVERAGE")
+
+    def test_string(self):
+        dv = DataValue(type="PRESSURE", name="p1", value=10)
+        self.assertEqual(str(dv), "PRESSURE p1 = 10 (AVERAGE)")
+        dv = DataValue(type="PRESSURE",
+                       name="p1",
+                       value=10,
+                       accuracy=0.1,
+                       quality="POOR")
+        self.assertEqual(str(dv), "PRESSURE p1 = 10 +/- 0.1 (POOR)")
diff --git a/force_bdss/core_evaluation_driver.py b/force_bdss/core_evaluation_driver.py
index ee8de2b1488d6e14798d4e75e58726b368dc9fda..d6f71816bc0aaf0317feae991de453acc6437f30 100644
--- a/force_bdss/core_evaluation_driver.py
+++ b/force_bdss/core_evaluation_driver.py
@@ -31,18 +31,18 @@ class CoreEvaluationDriver(BaseCoreDriver):
         mco_bundle = mco_model.bundle
         mco_communicator = mco_bundle.create_communicator()
 
-        parameters = mco_communicator.receive_from_mco(mco_model)
+        mco_data_values = mco_communicator.receive_from_mco(mco_model)
 
         ds_results = []
         for ds_model in workflow.data_sources:
             ds_bundle = ds_model.bundle
             data_source = ds_bundle.create_data_source()
-            ds_results.append(data_source.run(ds_model, parameters))
+            ds_results.extend(data_source.run(ds_model, mco_data_values))
 
         kpi_results = []
         for kpic_model in workflow.kpi_calculators:
             kpic_bundle = kpic_model.bundle
             kpi_calculator = kpic_bundle.create_kpi_calculator()
-            kpi_results.append(kpi_calculator.run(kpic_model, ds_results))
+            kpi_results.extend(kpi_calculator.run(kpic_model, ds_results))
 
         mco_communicator.send_to_mco(mco_model, kpi_results)
diff --git a/force_bdss/core_plugins/dummy/csv_extractor/csv_extractor_data_source.py b/force_bdss/core_plugins/dummy/csv_extractor/csv_extractor_data_source.py
index b42cf1b7a17207188acefa7bb0192b7e81a9dbcb..471f3ac6c18592ed248d6a18d12559bdc6359340 100644
--- a/force_bdss/core_plugins/dummy/csv_extractor/csv_extractor_data_source.py
+++ b/force_bdss/core_plugins/dummy/csv_extractor/csv_extractor_data_source.py
@@ -1,7 +1,5 @@
 import csv
-import numpy
-from force_bdss.api import BaseDataSource
-from force_bdss.api import DataSourceResult
+from force_bdss.api import BaseDataSource, DataValue
 
 
 class CSVExtractorDataSource(BaseDataSource):
@@ -11,15 +9,14 @@ class CSVExtractorDataSource(BaseDataSource):
             for rowindex, row in enumerate(reader):
                 if rowindex < model.row:
                     continue
+                elif rowindex == model.row:
+                    return [
+                        DataValue(
+                            type=model.cuba_type,
+                            value=float(row[model.column])
+                        )
+                    ]
+                else:
+                    break
 
-                if rowindex == model.row:
-                    return DataSourceResult(
-                        originator=self,
-                        value_types=[model.cuba_type],
-                        values=numpy.array(
-                            parameters.values[0]+float(
-                                row[model.column])).reshape(1, 1)
-                    )
-
-                return None
-            return None
+            raise IndexError("Could not find specified data.")
diff --git a/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py b/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py
index 1be1beb2559ce8aaa208b6bad69ba94718cb7b4a..a498b9e7e6ab847df6fc2c16ce47ce444c03eeb6 100644
--- a/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py
+++ b/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py
@@ -1,12 +1,12 @@
 import unittest
 
+from force_bdss.core.data_value import DataValue
 from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_data_source \
     import CSVExtractorDataSource
 from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_model import \
     CSVExtractorModel
 from force_bdss.data_sources.base_data_source_bundle import \
     BaseDataSourceBundle
-from force_bdss.data_sources.data_source_result import DataSourceResult
 from force_bdss.tests import fixtures
 
 try:
@@ -27,7 +27,26 @@ class TestCSVExtractorDataSource(unittest.TestCase):
         ds = CSVExtractorDataSource(self.bundle)
         model = CSVExtractorModel(self.bundle)
         model.filename = fixtures.get("foo.csv")
-        mock_params = mock.Mock()
-        mock_params.values = [1.0]
+        model.row = 3
+        model.column = 5
+        mock_params = []
         result = ds.run(model, mock_params)
-        self.assertIsInstance(result, DataSourceResult)
+        self.assertIsInstance(result, list)
+        self.assertEqual(len(result), 1)
+        self.assertIsInstance(result[0], DataValue)
+        self.assertEqual(result[0].value, 42)
+
+    def test_run_with_exception(self):
+        ds = CSVExtractorDataSource(self.bundle)
+        model = CSVExtractorModel(self.bundle)
+        model.filename = fixtures.get("foo.csv")
+        mock_params = []
+        model.row = 30
+        model.column = 5
+        with self.assertRaises(IndexError):
+            ds.run(model, mock_params)
+
+        model.row = 3
+        model.column = 50
+        with self.assertRaises(IndexError):
+            ds.run(model, mock_params)
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
index d5b53d90259823e576581e78e5fe1966d85b7a36..e1d10fda52d41edb50250fb31efde7be6c694935 100644
--- a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
@@ -1,7 +1,8 @@
 import sys
-import numpy
 
-from force_bdss.api import DataSourceParameters, BaseMCOCommunicator
+from force_bdss.api import (
+    BaseMCOCommunicator,
+    DataValue)
 
 
 class DummyDakotaCommunicator(BaseMCOCommunicator):
@@ -11,14 +12,11 @@ class DummyDakotaCommunicator(BaseMCOCommunicator):
         value_names = [p.value_name for p in model.parameters]
         value_types = [p.value_type for p in model.parameters]
 
-        return DataSourceParameters(
-            value_names=value_names,
-            value_types=value_types,
-            values=numpy.array(values)
-        )
+        return [
+            DataValue(type=type_, name=name, value=value)
+            for type_, name, value in zip(
+                value_types, value_names, values)]
 
-    def send_to_mco(self, model, kpi_results):
-        data = " ".join(
-            [" ".join(list(map(str, r.values.tolist()))) for r in kpi_results]
-        )
+    def send_to_mco(self, model, data_values):
+        data = " ".join([str(dv.value) for dv in data_values])
         sys.stdout.write(data)
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_communicator.py b/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_communicator.py
index 6e74d744f66e52cbb510bacde7a3879f0d200818..03e8e85328522fcbb3990933eac22ad18269138f 100644
--- a/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_communicator.py
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_communicator.py
@@ -1,5 +1,7 @@
 import unittest
 
+from force_bdss.core.data_value import DataValue
+
 try:
     import mock
 except ImportError:
@@ -9,7 +11,6 @@ from envisage.plugin import Plugin
 
 from force_bdss.core_plugins.dummy.dummy_dakota.dakota_bundle import (
     DummyDakotaBundle)
-from force_bdss.data_sources.data_source_parameters import DataSourceParameters
 
 from force_bdss.mco.parameters.base_mco_parameter_factory import \
     BaseMCOParameterFactory
@@ -31,7 +32,20 @@ class TestDakotaCommunicator(unittest.TestCase):
             stdin.read.return_value = "1"
 
             data = comm.receive_from_mco(model)
-            self.assertIsInstance(data, DataSourceParameters)
-            self.assertEqual(len(data.value_names), 1)
-            self.assertEqual(len(data.value_types), 1)
-            self.assertEqual(len(data.values), 1)
+            self.assertIsInstance(data, list)
+            self.assertEqual(len(data), 1)
+            self.assertEqual(data[0].value, 1)
+            self.assertEqual(data[0].type, "")
+
+    def test_send_to_mco(self):
+        bundle = DummyDakotaBundle(mock.Mock(spec=Plugin))
+        model = bundle.create_model()
+        comm = bundle.create_communicator()
+
+        with mock.patch("sys.stdout") as stdout:
+            dv = DataValue(value=100)
+            comm.send_to_mco(model, [dv, dv])
+            self.assertEqual(stdout.write.call_args[0][0], '100 100')
+
+            comm.send_to_mco(model, [])
+            self.assertEqual(stdout.write.call_args[0][0], '')
diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py
index cd0446b68480517853da8be7571eaf0336c34441..03c36de2f42e17926d2069a6b7723e46b986980e 100644
--- a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py
+++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py
@@ -1,12 +1,6 @@
-from force_bdss.api import BaseDataSource, DataSourceResult
+from force_bdss.api import BaseDataSource
 
 
 class DummyDataSource(BaseDataSource):
     def run(self, model, parameters):
-        print(parameters)
-        return DataSourceResult(
-                originator=self,
-                value_names=parameters.value_names,
-                value_types=parameters.value_types,
-                values=parameters.values.reshape(
-                    parameters.values.shape + (1,)))
+        return parameters
diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py
index 0fe0077dd20c4e35ff26b73fe94c12d6fdf67b22..bd104731babee708112797eebe991a1ca732504e 100644
--- a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py
+++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py
@@ -1,15 +1,6 @@
-from force_bdss.api import BaseKPICalculator, KPICalculatorResult, bundle_id
+from force_bdss.api import BaseKPICalculator
 
 
 class DummyKPICalculator(BaseKPICalculator):
-    id = bundle_id("enthought", "dummy_kpi_calculator")
-
     def run(self, model, data_source_results):
-        res = KPICalculatorResult(
-            originator=self,
-            value_names=data_source_results[0].value_names,
-            value_types=data_source_results[0].value_types,
-            values=data_source_results[0].values.reshape(
-                data_source_results[0].values.shape[:-1]))
-
-        return res
+        return data_source_results
diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/tests/test_dummy_kpi_calculator.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/tests/test_dummy_kpi_calculator.py
new file mode 100644
index 0000000000000000000000000000000000000000..7226b3d4c04b99a8aa6f24041ab8ae2121d3d994
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/tests/test_dummy_kpi_calculator.py
@@ -0,0 +1,23 @@
+import unittest
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from force_bdss.core_plugins.dummy.dummy_kpi_calculator.dummy_kpi_calculator \
+    import DummyKPICalculator
+from force_bdss.core_plugins.dummy.dummy_kpi_calculator \
+    .dummy_kpi_calculator_bundle import DummyKPICalculatorBundle
+from force_bdss.core_plugins.dummy.dummy_kpi_calculator \
+    .dummy_kpi_calculator_model import DummyKPICalculatorModel
+
+
+class TestDummyKPICalculator(unittest.TestCase):
+    def test_run(self):
+        bundle = mock.Mock(spec=DummyKPICalculatorBundle)
+        kpic = DummyKPICalculator(bundle)
+        model = DummyKPICalculatorModel(bundle)
+        input_ = []
+        output = kpic.run(model, [])
+        self.assertEqual(input_, output)
diff --git a/force_bdss/core_plugins/dummy/kpi_adder/kpi_adder_calculator.py b/force_bdss/core_plugins/dummy/kpi_adder/kpi_adder_calculator.py
index 4611683665384da3982d482e4ee99f783c15390b..94128b30519bf6bcac5fc63e0f418cd758ea7f80 100644
--- a/force_bdss/core_plugins/dummy/kpi_adder/kpi_adder_calculator.py
+++ b/force_bdss/core_plugins/dummy/kpi_adder/kpi_adder_calculator.py
@@ -1,22 +1,18 @@
-import numpy
-
-from force_bdss.api import BaseKPICalculator
-from force_bdss.api import KPICalculatorResult
+from force_bdss.api import BaseKPICalculator, DataValue
 
 
 class KPIAdderCalculator(BaseKPICalculator):
     def run(self, model, data_source_results):
         sum = 0.0
+
         for res in data_source_results:
-            try:
-                value_idx = res.value_types.index(model.cuba_type_in)
-            except ValueError:
+            if res.type != model.cuba_type_in:
                 continue
 
-            sum += res.values[value_idx].sum()
+            sum += res.value
 
-        return KPICalculatorResult(
-            originator=self,
-            value_types=[model.cuba_type_out],
-            values=numpy.array([sum])
-        )
+        return [
+            DataValue(
+                type=model.cuba_type_out,
+                value=sum
+            )]
diff --git a/force_bdss/core_plugins/dummy/kpi_adder/tests/test_kpi_adder_calculator.py b/force_bdss/core_plugins/dummy/kpi_adder/tests/test_kpi_adder_calculator.py
new file mode 100644
index 0000000000000000000000000000000000000000..93fc276c27bfd699d3c27d2141f2437a9fbd9798
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/kpi_adder/tests/test_kpi_adder_calculator.py
@@ -0,0 +1,28 @@
+import unittest
+
+from force_bdss.core.data_value import DataValue
+from force_bdss.core_plugins.dummy.kpi_adder.kpi_adder_model import \
+    KPIAdderModel
+from force_bdss.kpi.base_kpi_calculator_bundle import BaseKPICalculatorBundle
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from force_bdss.core_plugins.dummy.kpi_adder.kpi_adder_calculator import \
+    KPIAdderCalculator
+
+
+class TestKPIAdderCalculator(unittest.TestCase):
+    def test_basic_functionality(self):
+        kpic = KPIAdderCalculator(mock.Mock(spec=BaseKPICalculatorBundle))
+        model = KPIAdderModel(mock.Mock(spec=BaseKPICalculatorBundle))
+        model.cuba_type_in = "PRESSURE"
+        model.cuba_type_out = "TOTAL_PRESSURE"
+        dv1 = DataValue(type="PRESSURE", value=10)
+        dv2 = DataValue(type="PRESSURE", value=30)
+        dv3 = DataValue(type="VOLUME", value=100)
+        res = kpic.run(model, [dv1, dv2, dv3])
+        self.assertEqual(res[0].type, "TOTAL_PRESSURE")
+        self.assertEqual(res[0].value, 40)
diff --git a/force_bdss/data_sources/base_data_source.py b/force_bdss/data_sources/base_data_source.py
index 3a9fedbadbc7688f3dfcabc49509280758794ccf..6c6f5daed054fdcf6ec0b05abc6b51c4940a0be9 100644
--- a/force_bdss/data_sources/base_data_source.py
+++ b/force_bdss/data_sources/base_data_source.py
@@ -20,20 +20,20 @@ class BaseDataSource(ABCHasStrictTraits):
     @abc.abstractmethod
     def run(self, model, parameters):
         """
-        Executes the KPI evaluation and returns the results it computes.
-        Reimplement this method in your specific KPI calculator.
+        Executes the Data Source evaluation and returns the results it
+        computes. Reimplement this method in your specific DataSource.
 
         Parameters
         ----------
         model: BaseDataSourceModel
             The model of the DataSource, instantiated through create_model()
 
-        parameters: DataSourceParameters
-            a DataResultParameters instance containing the information coming
-            from the MCO
+        parameters: List(DataValue)
+            a list of DataValue objects containing the information needed
+            for the execution of the DataSource.
 
         Returns
         -------
-        DataSourceResult
-            Instance that holds the results computed by this DataSource.
+        List(DataValue)
+            A list containing the computed Data Values.
         """
diff --git a/force_bdss/data_sources/data_source_parameters.py b/force_bdss/data_sources/data_source_parameters.py
deleted file mode 100644
index 378ad26c4ee99d2f565382e286239048cc125861..0000000000000000000000000000000000000000
--- a/force_bdss/data_sources/data_source_parameters.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from traits.api import HasStrictTraits, Array, List, String
-
-
-class DataSourceParameters(HasStrictTraits):
-    """Contains the parameters as passed from the MCO."""
-    #: The user-defined names associated to the values.
-    value_names = List(String)
-
-    #: The CUBA types associated to the values
-    value_types = List(String)
-
-    #: The values as a single array.
-    values = Array(shape=(None,))
-
-    def __str__(self):
-        return """
-        DataSourceParameters
-        value_names:
-        {}
-        value_types:
-        {}
-        values:
-        {}
-        """.format(str(self.value_names),
-                   str(self.value_types),
-                   str(self.values))
diff --git a/force_bdss/data_sources/data_source_result.py b/force_bdss/data_sources/data_source_result.py
deleted file mode 100644
index d19c16b203e57b8192753eba1836dbb31f8e2fa6..0000000000000000000000000000000000000000
--- a/force_bdss/data_sources/data_source_result.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from traits.api import HasTraits, Array, ArrayOrNone, List, String, Instance
-
-from .base_data_source import BaseDataSource
-
-
-class DataSourceResult(HasTraits):
-    """Represents the result of a DataSource evaluation.
-
-    Note
-    ----
-    Difference between accuracy and quality:
-      - uncertainty is a numerical quantity defining the accuracy of the value.
-        For example, a pressure can be 10.4 +/- 0.1, with 0.1 being the
-        accuracy
-      - quality is the level of importance and reliability of that value.
-        It should be considered as a weight of how much trust one should hold
-        on this information.
-    """
-
-    #: A reference to the DataSource that computed this result.
-    originator = Instance(BaseDataSource)
-
-    #: The user-defined names associated to each result.
-    value_names = List(String)
-
-    #: The CUBA types of each value.
-    value_types = List(String)
-
-    #: The values for each entry. Note that this is a NxM array, allowing
-    #: to propagate more than single scalar values associated to a given value.
-    values = Array(shape=(None, None))
-
-    #: If present, the numerical accuracy of the above values.
-    accuracy = ArrayOrNone(shape=(None, None))
-
-    #: If present, the assessed quality of the above values.
-    quality = ArrayOrNone(shape=(None, None))
-
-    def __str__(self):
-        return """
-        DataSourceResults
-
-        originator:
-        {}
-
-        value_names:
-        {}
-
-        value_types:
-        {}
-
-        values:
-        {}
-
-        Accuracy:
-        {}
-
-        Quality:
-        {}
-        """.format(
-            self.originator,
-            self.value_names,
-            self.value_types,
-            self.values,
-            self.accuracy,
-            self.quality)
diff --git a/force_bdss/kpi/base_kpi_calculator.py b/force_bdss/kpi/base_kpi_calculator.py
index 0d8664794acb1e3c00df58767cfecb317e9ff0f5..1bb1bf4867755639e5edf999ef9748a0e0cd8495 100644
--- a/force_bdss/kpi/base_kpi_calculator.py
+++ b/force_bdss/kpi/base_kpi_calculator.py
@@ -18,7 +18,7 @@ class BaseKPICalculator(ABCHasStrictTraits):
         super(BaseKPICalculator, self).__init__(*args, **kwargs)
 
     @abc.abstractmethod
-    def run(self, model, data_source_results):
+    def run(self, model, data_values):
         """
         Executes the KPI evaluation and returns the results it computes.
         Reimplement this method in your specific KPI calculator.
@@ -29,13 +29,12 @@ class BaseKPICalculator(ABCHasStrictTraits):
             The model of the KPI Calculator, instantiated through
             create_model()
 
-        data_source_results:
-            a list of DataSourceResult instances containing the results of the
-            evaluation. Each DataSourceResult contains the results from one
-            specific DataSource.
+        data_values:
+            a list of DataValue instances containing data from the
+            MCO and DataSources.
 
         Returns
         -------
-        KPICalculatorResult
-            Instance that holds the results computed by this KPICalculator.
+        List[DataValue]:
+            The result of this KPI evaluation, as a list of DataValues.
         """
diff --git a/force_bdss/kpi/kpi_calculator_result.py b/force_bdss/kpi/kpi_calculator_result.py
deleted file mode 100644
index dce0df90bd0fc895ccfee194f5ec10fe47335405..0000000000000000000000000000000000000000
--- a/force_bdss/kpi/kpi_calculator_result.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from traits.api import HasTraits, List, Array, ArrayOrNone, String, Instance
-
-from .base_kpi_calculator import BaseKPICalculator
-
-
-class KPICalculatorResult(HasTraits):
-    """Contains the results from a single KPICalculator evaluation"""
-
-    #: The originating KPI calculator
-    originator = Instance(BaseKPICalculator)
-
-    #: The user-attributed names of each computed value
-    value_names = List(String)
-
-    #: The CUBA types of each of the computed values
-    value_types = List(String)
-
-    #: The values, as a single array of values
-    values = Array(shape=(None, ))
-
-    #: If present, the numerical accuracy of the above values.
-    accuracy = ArrayOrNone(shape=(None, ))
-
-    #: If present, the quality of the above values.
-    quality = ArrayOrNone(shape=(None, ))
-
-    def __str__(self):
-        return """
-        DataSourceResults
-
-        originator:
-        {}
-
-        value_names:
-        {}
-
-        value_types:
-        {}
-
-        values:
-        {}
-
-        Accuracy:
-        {}
-
-        Quality:
-        {}
-        """.format(
-                self.originator,
-                self.value_names,
-                self.value_types,
-                self.values,
-                self.accuracy,
-                self.quality)
diff --git a/force_bdss/mco/base_mco_communicator.py b/force_bdss/mco/base_mco_communicator.py
index 4cb0f3bf2b534f6c804a5fbbcd1049a11933b65f..cad5ef3b965e4689d7394848d2cc98dd65ea4a2f 100644
--- a/force_bdss/mco/base_mco_communicator.py
+++ b/force_bdss/mco/base_mco_communicator.py
@@ -29,8 +29,8 @@ class BaseMCOCommunicator(ABCHasStrictTraits):
         The conversion is specific to the format of the communication
         between the MCO and its evaluator program.
 
-        Must return a single DataSourceParameters object, containing
-        the parameters as passed by the MCO.
+        Must return a list of DataValue objects, containing the data passed
+        by the MCO.
 
         Parameters
         ----------
@@ -39,9 +39,8 @@ class BaseMCOCommunicator(ABCHasStrictTraits):
 
         Returns
         -------
-        DataSourceParameters
-            An instance of the DataSourceParameters with the appropriate
-            information filled in.
+        List(DataValue)
+            A list of the DataValues with the appropriate information filled in
         """
 
     @abc.abstractmethod
@@ -56,6 +55,6 @@ class BaseMCOCommunicator(ABCHasStrictTraits):
         model: BaseMCOModel
             The model of the optimizer, instantiated through create_model()
 
-        kpi_results: List(KPICalculatorResult)
+        kpi_results: List(DataValue)
             A list of KPI calculator results, one per each KPI calculator.
         """
diff --git a/force_bdss/tests/test_core_evaluation_driver.py b/force_bdss/tests/test_core_evaluation_driver.py
index 5be1849eba262b3460f68ad49f8e284d9bd61e77..3ce84809480eb25565fb014814feed26888313e8 100644
--- a/force_bdss/tests/test_core_evaluation_driver.py
+++ b/force_bdss/tests/test_core_evaluation_driver.py
@@ -53,7 +53,7 @@ class NullMCOCommunicator(BaseMCOCommunicator):
         pass
 
     def receive_from_mco(self, model):
-        pass
+        return []
 
 
 class NullMCOBundle(BaseMCOBundle):
@@ -78,7 +78,7 @@ class NullKPICalculatorModel(BaseKPICalculatorModel):
 
 class NullKPICalculator(BaseKPICalculator):
     def run(self, model, data_source_results):
-        pass
+        return []
 
 
 class NullKPICalculatorBundle(BaseKPICalculatorBundle):
@@ -95,7 +95,7 @@ class NullDataSourceModel(BaseDataSourceModel):
 
 class NullDataSource(BaseDataSource):
     def run(self, model, parameters):
-        pass
+        return []
 
 
 class NullDataSourceBundle(BaseDataSourceBundle):