diff --git a/examples/test_workflow.json b/examples/test_workflow.json
index f0fa936ec307ee749bef6b3e85bb4bdc05303f4e..64e04bbbbe181604dd97217b241c2d1a27c06d11 100644
--- a/examples/test_workflow.json
+++ b/examples/test_workflow.json
@@ -1,9 +1,17 @@
 {
-    "multi_criteria_optimization": {
-        "name": "basic"
+  "multi_criteria_optimizer": {
+    "name": "basic",
+    "model_data": {}
+  },
+  "data_sources": [
+    {
+      "name": "viscosity",
+      "model_data": {}
     },
-    "data_sources": [
-        "viscosity", "price"
-    ]
+    {
+      "name": "price",
+      "model_data": {}
+    }
+  ]
 }
 
diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index 02625f2a01382f0810d2163910937b3f1ff0dd92..57051c180ce7336c08107185668d2b9b54d2345b 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -36,34 +36,36 @@ class CoreMCODriver(Plugin):
         workflow = self.application.workflow
         if self.application.evaluate:
             for requested_ds in workflow.data_sources:
-                ds_bundle = self._find_data_source_bundle_by_name(requested_ds)
+                ds_bundle = self._find_data_source_bundle_by_name(
+                    requested_ds.name)
                 if ds_bundle:
                     ds_model = ds_bundle.create_model(requested_ds.model_data)
-                    data_source = ds_bundle.create_data_source(self, ds_model)
+                    data_source = ds_bundle.create_data_source(
+                        self.application, ds_model)
                     data_source.run()
                 else:
                     raise Exception("Requested data source {} but don't know "
-                                    "to find it.".format(requested_ds))
+                                    "to find it.".format(requested_ds.name))
         else:
             mco_data = workflow.multi_criteria_optimizer
             mco_bundle = self._find_mco_bundle_by_name(mco_data.name)
             if mco_bundle:
                 mco_model = mco_bundle.create_model(mco_data.model_data)
-                mco = mco_bundle.create_optimizer(self, mco_model)
+                mco = mco_bundle.create_optimizer(self.application, mco_model)
                 mco.run()
             else:
                 raise Exception("Requested MCO {} but it's not available"
                                 "to compute it.".format(mco_data.name))
 
-    def _find_data_source_by_name(self, name):
-        for ds in self.data_sources:
+    def _find_data_source_bundle_by_name(self, name):
+        for ds in self.data_source_bundles:
             if ds.name == name:
                 return ds
 
         return None
 
-    def _find_mco_by_name(self, name):
-        for mco in self.multi_criteria_optimizers:
+    def _find_mco_bundle_by_name(self, name):
+        for mco in self.mco_bundles:
             if mco.name == name:
                 return mco
 
diff --git a/force_bdss/data_sources/basic_bundle.py b/force_bdss/data_sources/basic_bundle.py
index 5e4f87ccd7a2f33a962b3ab0c1ad14a611748019..a0764c4fbdbeaee01980c3a0034e69b1e8a9538d 100644
--- a/force_bdss/data_sources/basic_bundle.py
+++ b/force_bdss/data_sources/basic_bundle.py
@@ -1,4 +1,4 @@
-from traits.api import provides, HasStrictTraits
+from traits.api import provides, HasStrictTraits, String
 
 from force_bdss.data_sources.basic_data_source import BasicDataSource
 from force_bdss.data_sources.i_data_source_bundle import IDataSourceBundle
@@ -7,6 +7,8 @@ from force_bdss.mco.basic_model import BasicModel
 
 @provides(IDataSourceBundle)
 class BasicBundle(HasStrictTraits):
+    name = String("basic")
+
     def create_model(self, model_data):
         return BasicModel.from_json(model_data)
 
diff --git a/force_bdss/data_sources/price_bundle.py b/force_bdss/data_sources/price_bundle.py
index 678517e45a7305f095d2725f173a31da1a8953ca..7067d1aaa1f711a897fa76b181c7a0bc2c764841 100644
--- a/force_bdss/data_sources/price_bundle.py
+++ b/force_bdss/data_sources/price_bundle.py
@@ -1,4 +1,5 @@
 from traits.api import provides, HasStrictTraits
+from traits.trait_types import String
 
 from force_bdss.data_sources.i_data_source_bundle import IDataSourceBundle
 from force_bdss.data_sources.price_data_source import PriceDataSource
@@ -7,6 +8,8 @@ from force_bdss.data_sources.price_model import PriceModel
 
 @provides(IDataSourceBundle)
 class PriceBundle(HasStrictTraits):
+    name = String("price")
+
     def create_model(self, model_data):
         return PriceModel.from_json(model_data)
 
diff --git a/force_bdss/data_sources/viscosity_bundle.py b/force_bdss/data_sources/viscosity_bundle.py
index 3e495a5e2f8da6ec0ae0ad53524bced09c87f9bb..c338a98fde569a9112e67d850ed354ee15eaca85 100644
--- a/force_bdss/data_sources/viscosity_bundle.py
+++ b/force_bdss/data_sources/viscosity_bundle.py
@@ -1,4 +1,5 @@
 from traits.api import provides, HasStrictTraits
+from traits.trait_types import String
 
 from force_bdss.data_sources.viscosity_model import ViscosityModel
 from .i_data_source_bundle import IDataSourceBundle
@@ -7,6 +8,8 @@ from .viscosity_data_source import ViscosityDataSource
 
 @provides(IDataSourceBundle)
 class ViscosityBundle(HasStrictTraits):
+    name = String("viscosity")
+
     def create_model(self, model_data):
         return ViscosityModel.from_json(model_data)
 
diff --git a/force_bdss/mco/basic_bundle.py b/force_bdss/mco/basic_bundle.py
index 86139561ad1de0e4a8814fa132e1605440629be5..a673f316b0bed910cd0ce58b69e64b984cfe9470 100644
--- a/force_bdss/mco/basic_bundle.py
+++ b/force_bdss/mco/basic_bundle.py
@@ -1,4 +1,5 @@
 from traits.has_traits import HasStrictTraits, provides
+from traits.trait_types import String
 
 from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle
 from .basic_model import BasicModel
@@ -7,6 +8,8 @@ from .basic_optimizer import BasicOptimizer
 
 @provides(IMultiCriteriaOptimizerBundle)
 class BasicBundle(HasStrictTraits):
+    name = String("basic")
+
     def create_model(self, model_data):
         return BasicModel.from_json(model_data)
 
diff --git a/force_bdss/mco/dakota_bundle.py b/force_bdss/mco/dakota_bundle.py
index a33c5efafe5051779c26fd773f38bce01ee0d86d..1ad413bd98a4ee40f7c49c8f38811ec5d5c4b1ed 100644
--- a/force_bdss/mco/dakota_bundle.py
+++ b/force_bdss/mco/dakota_bundle.py
@@ -1,4 +1,5 @@
 from traits.has_traits import HasStrictTraits, provides
+from traits.trait_types import String
 
 from force_bdss.mco.dakota_optimizer import DakotaOptimizer
 from force_bdss.mco.dakota_model import DakotaModel
@@ -7,6 +8,8 @@ from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle
 
 @provides(IMultiCriteriaOptimizerBundle)
 class DakotaBundle(HasStrictTraits):
+    name = String("dakota")
+
     def create_model(self, model_data):
         return DakotaModel.from_json(model_data)
 
diff --git a/force_bdss/workspecs/data_source.py b/force_bdss/workspecs/data_source.py
new file mode 100644
index 0000000000000000000000000000000000000000..944e41ce68b6fa60fd9be2c77a6f651df2832b00
--- /dev/null
+++ b/force_bdss/workspecs/data_source.py
@@ -0,0 +1,16 @@
+from traits.has_traits import HasStrictTraits
+from traits.trait_types import String, Dict
+
+
+class DataSource(HasStrictTraits):
+    name = String()
+    model_data = Dict()
+
+    @classmethod
+    def from_json(cls, json_data):
+        self = cls(
+            name=json_data["name"],
+            model_data=json_data["model_data"]
+        )
+
+        return self
diff --git a/force_bdss/workspecs/multi_criteria_optimization.py b/force_bdss/workspecs/multi_criteria_optimization.py
deleted file mode 100644
index 9e5e3152e68a168d0de2d2e5f0ff8d2031c1b25d..0000000000000000000000000000000000000000
--- a/force_bdss/workspecs/multi_criteria_optimization.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from traits.api import HasStrictTraits, String
-
-
-class MultiCriteriaOptimization(HasStrictTraits):
-    name = String()
-
-    @classmethod
-    def from_json(cls, json_data):
-        self = cls(
-            name=json_data["name"]
-        )
-
-        return self
diff --git a/force_bdss/workspecs/multi_criteria_optimizer.py b/force_bdss/workspecs/multi_criteria_optimizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..72a2fa6b264fb3f5cd0be4fc9af9fb284a6fca96
--- /dev/null
+++ b/force_bdss/workspecs/multi_criteria_optimizer.py
@@ -0,0 +1,15 @@
+from traits.api import HasStrictTraits, String, Dict
+
+
+class MultiCriteriaOptimizer(HasStrictTraits):
+    name = String()
+    model_data = Dict()
+
+    @classmethod
+    def from_json(cls, json_data):
+        self = cls(
+            name=json_data["name"],
+            model_data=json_data["model_data"]
+        )
+
+        return self
diff --git a/force_bdss/workspecs/workflow.py b/force_bdss/workspecs/workflow.py
index 871e9b7d1acab73292e017903a632d3d174cfb2f..88e5b60203bec836fbad4ef3c2bd7c3dae1b42e0 100644
--- a/force_bdss/workspecs/workflow.py
+++ b/force_bdss/workspecs/workflow.py
@@ -1,20 +1,24 @@
 from traits.api import HasStrictTraits, Instance, String, List
 
-from .multi_criteria_optimization import MultiCriteriaOptimization
+from force_bdss.workspecs.data_source import DataSource
+from .multi_criteria_optimizer import MultiCriteriaOptimizer
 
 
 class Workflow(HasStrictTraits):
     name = String()
-    multi_criteria_optimization = Instance(MultiCriteriaOptimization)
-    data_sources = List(String)
+    multi_criteria_optimizer = Instance(MultiCriteriaOptimizer)
+    data_sources = List(DataSource)
 
     @classmethod
     def from_json(cls, json_data):
+
         self = cls(
-            multi_criteria_optimization=MultiCriteriaOptimization.from_json(
-                    json_data["multi_criteria_optimization"]
+            multi_criteria_optimizer=MultiCriteriaOptimizer.from_json(
+                    json_data["multi_criteria_optimizer"]
             ),
-            data_sources=json_data["data_sources"]
+            data_sources=[
+                DataSource.from_json(data_source_data)
+                for data_source_data in json_data["data_sources"]]
             )
 
         return self