diff --git a/force_bdss/core/input_slot_map.py b/force_bdss/core/input_slot_map.py
new file mode 100644
index 0000000000000000000000000000000000000000..d43af9550c5a5432f5af956197bc39b24f542e88
--- /dev/null
+++ b/force_bdss/core/input_slot_map.py
@@ -0,0 +1,12 @@
+from traits.api import HasStrictTraits, Enum, String
+
+
+class InputSlotMap(HasStrictTraits):
+    """Class that specifies the origin of data for the slots of a data source.
+    """
+    #: If MCO, the source is the MCO parameter with name specified at
+    #: value_name. If Fixed, the value specified in "value" will be used
+    #: instead.
+    source = Enum('MCO', 'Fixed')
+    name = String()
+    value = String()
diff --git a/force_bdss/data_sources/base_data_source_model.py b/force_bdss/data_sources/base_data_source_model.py
index cc3f30ea2f0c37f693fa222e5783a96d04654fa2..75f7c5396c13e869f270bd22bc5713080dbfb624 100644
--- a/force_bdss/data_sources/base_data_source_model.py
+++ b/force_bdss/data_sources/base_data_source_model.py
@@ -1,5 +1,6 @@
-from traits.api import ABCHasStrictTraits, Instance
+from traits.api import ABCHasStrictTraits, Instance, List, String
 
+from force_bdss.core.input_slot_map import InputSlotMap
 from .i_data_source_bundle import IDataSourceBundle
 
 
@@ -15,6 +16,21 @@ class BaseDataSourceModel(ABCHasStrictTraits):
     #: retrieve it as the originating factory.
     bundle = Instance(IDataSourceBundle, visible=False, transient=True)
 
+    #: Specifies binding between input slots and source for that value.
+    #: Each InputSlotMap instance specifies this information for each of the
+    #: slots.
+    input_slot_maps = List(Instance(InputSlotMap))
+
+    #: Allows to assign names to the output slots, so that they can be
+    #: referenced somewhere else (e.g. the KPICalculators).
+    output_slot_names = List(String())
+
     def __init__(self, bundle, *args, **kwargs):
         self.bundle = bundle
         super(BaseDataSourceModel, self).__init__(*args, **kwargs)
+
+    def __getstate__(self):
+        state = super(BaseDataSourceModel, self).__getstate__()
+        state["input_slot_maps"] = [
+            x.__getstate__() for x in self.input_slot_maps
+        ]
diff --git a/force_bdss/io/workflow_reader.py b/force_bdss/io/workflow_reader.py
index 44677cf92b767fab18496bae2b972061ed3dd8fd..c55536ba8343d4bf19efc5c69b223e205a72b399 100644
--- a/force_bdss/io/workflow_reader.py
+++ b/force_bdss/io/workflow_reader.py
@@ -3,6 +3,7 @@ import logging
 
 from traits.api import HasStrictTraits, Instance
 
+from force_bdss.core.input_slot_map import InputSlotMap
 from ..bundle_registry_plugin import BundleRegistryPlugin
 from ..workspecs.workflow import Workflow
 
@@ -145,7 +146,11 @@ class WorkflowReader(HasStrictTraits):
         for ds_entry in wf_data["data_sources"]:
             ds_id = ds_entry["id"]
             ds_bundle = registry.data_source_bundle_by_id(ds_id)
-            data_sources.append(ds_bundle.create_model(ds_entry["model_data"]))
+            model_data = ds_entry["model_data"]
+            model_data["input_slot_maps"] = self._extract_input_slot_maps(
+                model_data["input_slot_maps"]
+            )
+            data_sources.append(ds_bundle.create_model(model_data))
 
         return data_sources
 
@@ -169,9 +174,14 @@ class WorkflowReader(HasStrictTraits):
         for kpic_entry in wf_data["kpi_calculators"]:
             kpic_id = kpic_entry["id"]
             kpic_bundle = registry.kpi_calculator_bundle_by_id(kpic_id)
+            model_data = kpic_entry["model_data"]
+            model_data["input_slot_maps"] = self._extract_input_slot_maps(
+                model_data["input_slot_maps"]
+            )
 
             kpi_calculators.append(
-                kpic_bundle.create_model(kpic_entry["model_data"]))
+                kpic_bundle.create_model(model_data)
+            )
 
         return kpi_calculators
 
@@ -198,3 +208,6 @@ class WorkflowReader(HasStrictTraits):
             parameters.append(model)
 
         return parameters
+
+    def _extract_input_slot_maps(self, maps_data):
+        return [InputSlotMap(**d) for d in maps_data]
diff --git a/force_bdss/kpi/base_kpi_calculator_model.py b/force_bdss/kpi/base_kpi_calculator_model.py
index 1b254a96b5198709e437b8a90187730caafe2919..92794c57b5471a95a27604bfe22bd6dc7ba9b2ad 100644
--- a/force_bdss/kpi/base_kpi_calculator_model.py
+++ b/force_bdss/kpi/base_kpi_calculator_model.py
@@ -1,5 +1,6 @@
-from traits.api import ABCHasStrictTraits, Instance
+from traits.api import ABCHasStrictTraits, Instance, List, String
 
+from ..core.input_slot_map import InputSlotMap
 from .i_kpi_calculator_bundle import IKPICalculatorBundle
 
 
@@ -15,6 +16,21 @@ class BaseKPICalculatorModel(ABCHasStrictTraits):
     #: retrieve it as the originating factory.
     bundle = Instance(IKPICalculatorBundle, visible=False, transient=True)
 
+    #: Specifies binding between input slots and source for that value.
+    #: Each InputSlotMap instance specifies this information for each of the
+    #: slots.
+    input_slot_maps = List(Instance(InputSlotMap))
+
+    #: Allows to assign names to the output slots, so that they can be
+    #: referenced somewhere else (e.g. the KPICalculators).
+    output_slot_names = List(String())
+
     def __init__(self, bundle, *args, **kwargs):
         self.bundle = bundle
         super(BaseKPICalculatorModel, self).__init__(*args, **kwargs)
+
+    def __getstate__(self):
+        state = super(BaseKPICalculatorModel, self).__getstate__()
+        state["input_slot_maps"] = [
+            x.__getstate__() for x in self.input_slot_maps
+            ]
diff --git a/force_bdss/tests/fixtures/test_csv.json b/force_bdss/tests/fixtures/test_csv.json
index 726de30843d158ec3b1aeb4afcc96e92b9ecaa5d..880e66ee9afa5f3b4a8ebcd7ac0c364d5474ffff 100644
--- a/force_bdss/tests/fixtures/test_csv.json
+++ b/force_bdss/tests/fixtures/test_csv.json
@@ -23,7 +23,12 @@
           "filename": "foo.csv",
           "row": 3,
           "column": 5,
-          "cuba_type": "PRESSURE"
+          "cuba_type": "PRESSURE",
+          "input_slot_maps": [
+          ],
+          "output_slot_names": [
+            "p1"
+          ]
         }
       },
       {
@@ -32,7 +37,12 @@
           "filename": "foo.csv",
           "row": 3,
           "column": 5,
-          "cuba_type": "PRESSURE"
+          "cuba_type": "PRESSURE",
+          "input_slot_maps": [
+          ],
+          "output_slot_names": [
+            "p2"
+          ]
         }
       }
     ],
@@ -41,7 +51,18 @@
         "id": "force.bdss.enthought.bundle.kpi_adder",
         "model_data": {
           "cuba_type_in": "PRESSURE",
-          "cuba_type_out": "TOTAL_PRESSURE"
+          "cuba_type_out": "TOTAL_PRESSURE",
+          "input_slot_maps": [
+            {
+              "name": "p1"
+            },
+            {
+              "name": "p2"
+            }
+          ],
+          "output_slot_names": [
+            "ptot"
+          ]
         }
       }
     ]