diff --git a/force_bdss/core/data_value.py b/force_bdss/core/data_value.py
index 9da19abdd53a7ecd59b3a808a93bb2d5fdef1bb7..51226d9f407e7320274fd595f91deacd9de38f0c 100644
--- a/force_bdss/core/data_value.py
+++ b/force_bdss/core/data_value.py
@@ -22,9 +22,6 @@ class DataValue(HasStrictTraits):
     #: A flag for the quality of the data.
     quality = Enum("AVERAGE", "POOR", "GOOD")
 
-    # Set by the engine. True if the data value contains a KPI.
-    is_kpi = Bool(False)
-
     def __str__(self):
 
         s = "{} {} = {}".format(
@@ -35,7 +32,4 @@ class DataValue(HasStrictTraits):
 
         s += " ({})".format(str(self.quality))
 
-        if self.is_kpi:
-            s += " (KPI)"
-
         return s
diff --git a/force_bdss/core/kpi_specification.py b/force_bdss/core/kpi_specification.py
new file mode 100644
index 0000000000000000000000000000000000000000..672a9cf54fccfd5484b2f3a62e0e43b829adf2e1
--- /dev/null
+++ b/force_bdss/core/kpi_specification.py
@@ -0,0 +1,10 @@
+from traits.api import Enum, HasStrictTraits
+
+from force_bdss.local_traits import Identifier
+
+
+class KPISpecification(HasStrictTraits):
+    #: The user defined name of the variable containing the kpi value.
+    name = Identifier()
+
+    target = Enum("MINIMISE")
diff --git a/force_bdss/core/output_slot_info.py b/force_bdss/core/output_slot_info.py
index 8385fa4f11b98d5bd200b6b4f86dabaa468e2da6..6fd360db20894e9808b79592ff5f93f0face13c5 100644
--- a/force_bdss/core/output_slot_info.py
+++ b/force_bdss/core/output_slot_info.py
@@ -13,7 +13,3 @@ class OutputSlotInfo(HasStrictTraits):
     """
     #: The user defined name of the variable containing the value.
     name = Identifier()
-
-    #: True if the value associated to this output slot must be exported as
-    #: a KPI.
-    is_kpi = Bool(False)
diff --git a/force_bdss/core_evaluation_driver.py b/force_bdss/core_evaluation_driver.py
index 151da8cbd3cb069608043df8d92acdc156fb3e39..e89f72446a5f4d9e995213b6bc6ed05544ed4084 100644
--- a/force_bdss/core_evaluation_driver.py
+++ b/force_bdss/core_evaluation_driver.py
@@ -65,7 +65,15 @@ def execute_workflow(workflow, data_values):
         available_data_values += ds_results
 
     log.info("Aggregating KPI data")
-    kpi_results = [dv for dv in available_data_values if dv.is_kpi]
+
+    kpi_results = []
+    kpi_names = [kpi.name for kpi in workflow.mco.kpis]
+
+    kpi_results = [
+        dv
+        for dv in available_data_values
+        if dv.name in kpi_names
+    ]
 
     return kpi_results
 
@@ -165,7 +173,6 @@ def _compute_layer_results(environment_data_values,
         # Add the names as specified by the user.
         for dv, output_slot_info in zip(res, model.output_slot_info):
             dv.name = output_slot_info.name
-            dv.is_kpi = output_slot_info.is_kpi
 
         # If the name was not specified, simply discard the value,
         # because apparently the user is not interested in it.
diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index 733b34b8a07c06a662c72b8f7c25bf0b7729071f..46b9cda35e39fe97fd0f4d50ff168109f54f460f 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -88,17 +88,10 @@ class CoreMCODriver(BaseCoreDriver):
 
     @on_trait_change("mco:started")
     def _deliver_start_event(self):
-        output_kpis = []
-        for layer in self.workflow.execution_layers:
-            for data_source in layer.data_sources:
-                output_kpis.extend(
-                    info for info in data_source.output_slot_info
-                    if info.is_kpi
-                )
-
+        mco_model = self.workflow.mco
         self._deliver_event(MCOStartEvent(
-            input_names=tuple(p.name for p in self.workflow.mco.parameters),
-            output_names=tuple([on.name for on in output_kpis])
+            input_names=tuple(p.name for p in mco_model.parameters),
+            output_names=tuple([kpi.name for kpi in mco_model.kpis])
         ))
 
     @on_trait_change("mco:finished")
diff --git a/force_bdss/mco/base_mco_model.py b/force_bdss/mco/base_mco_model.py
index f1e545a579e9a986bb2a57147b7f0ec30f79d7bc..af89084dfeefc44ed407e22fc2f0c86ebe3887c5 100644
--- a/force_bdss/mco/base_mco_model.py
+++ b/force_bdss/mco/base_mco_model.py
@@ -1,5 +1,6 @@
 from traits.api import ABCHasStrictTraits, Instance, List
 
+from force_bdss.core.kpi_specification import KPISpecification
 from .parameters.base_mco_parameter import BaseMCOParameter
 from .i_mco_factory import IMCOFactory
 
@@ -20,6 +21,9 @@ class BaseMCOModel(ABCHasStrictTraits):
     # A list of the parameters for the MCO
     parameters = List(BaseMCOParameter, visible=False)
 
+    # A list of KPI specification objects and their objective.
+    kpis = List(KPISpecification, visible=False)
+
     def __init__(self, factory, *args, **kwargs):
         self.factory = factory
         super(BaseMCOModel, self).__init__(*args, **kwargs)