diff --git a/force_bdss/core_evaluation_driver.py b/force_bdss/core_evaluation_driver.py
index 61dac3e0e6bb28028fd973002dc6086d006c6ff6..ebe24cf6bf9702bb5f1c0eb28b11c303222b5a4a 100644
--- a/force_bdss/core_evaluation_driver.py
+++ b/force_bdss/core_evaluation_driver.py
@@ -25,11 +25,9 @@ class CoreEvaluationDriver(BaseCoreDriver):
 
         mco_model = workflow.mco
         mco_bundle = mco_model.bundle
-        mco_communicator = mco_bundle.create_communicator(
-            self.application,
-            mco_model)
+        mco_communicator = mco_bundle.create_communicator()
 
-        parameters = mco_communicator.receive_from_mco()
+        parameters = mco_communicator.receive_from_mco(mco_model)
 
         ds_results = []
         for ds_model in workflow.data_sources:
@@ -45,4 +43,4 @@ class CoreEvaluationDriver(BaseCoreDriver):
                 self.application, kpic_model)
             kpi_results.append(kpi_calculator.run(ds_results))
 
-        mco_communicator.send_to_mco(kpi_results)
+        mco_communicator.send_to_mco(mco_model, kpi_results)
diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index 07973ccbf329a5da5d0cd318cfe4fa623978b6e9..0affb659b4a771d966cc4f6869fff110c469bf47 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -26,5 +26,5 @@ class CoreMCODriver(BaseCoreDriver):
 
         mco_model = workflow.mco
         mco_bundle = mco_model.bundle
-        mco = mco_bundle.create_optimizer(self.application, mco_model)
-        mco.run()
+        mco = mco_bundle.create_optimizer()
+        mco.run(mco_model)
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py
index 7fda192e33cb455289812efd03c320815b2c26af..925a127fa43b9c43f713373268a5e7831cf7abe6 100644
--- a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py
@@ -16,8 +16,8 @@ class DummyDakotaBundle(BaseMCOBundle):
             model_data = {}
         return DummyDakotaModel(self, **model_data)
 
-    def create_optimizer(self, application, model):
-        return DummyDakotaOptimizer(self, application, model)
+    def create_optimizer(self):
+        return DummyDakotaOptimizer(self)
 
-    def create_communicator(self, application, model):
-        return DummyDakotaCommunicator(self, application, model)
+    def create_communicator(self):
+        return DummyDakotaCommunicator(self)
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 9f9d4419447c36cd0ab23e9236fd5fcd3985274e..d5b53d90259823e576581e78e5fe1966d85b7a36 100644
--- a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
@@ -5,11 +5,11 @@ from force_bdss.api import DataSourceParameters, BaseMCOCommunicator
 
 
 class DummyDakotaCommunicator(BaseMCOCommunicator):
-    def receive_from_mco(self):
+    def receive_from_mco(self, model):
         data = sys.stdin.read()
         values = list(map(float, data.split()))
-        value_names = [p.value_name for p in self.model.parameters]
-        value_types = [p.value_type for p in self.model.parameters]
+        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,
@@ -17,7 +17,7 @@ class DummyDakotaCommunicator(BaseMCOCommunicator):
             values=numpy.array(values)
         )
 
-    def send_to_mco(self, kpi_results):
+    def send_to_mco(self, model, kpi_results):
         data = " ".join(
             [" ".join(list(map(str, r.values.tolist()))) for r in kpi_results]
         )
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py
index b4938536db4a98d7533d6c5551884d1e704760fd..2114efe81bc550500064a74f8466e87fe36f399b 100644
--- a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py
@@ -15,8 +15,8 @@ def rotated_range(start, stop, starting_value):
 
 
 class DummyDakotaOptimizer(BaseMCO):
-    def run(self):
-        parameters = self.model.parameters
+    def run(self, model):
+        parameters = model.parameters
 
         values = []
         for p in parameters:
@@ -28,11 +28,13 @@ class DummyDakotaOptimizer(BaseMCO):
 
         value_iterator = itertools.product(*values)
 
+        application = self.bundle.plugin.application
+
         for value in value_iterator:
             ps = subprocess.Popen(
                 [sys.argv[0],
                  "--evaluate",
-                 self.application.workflow_filepath],
+                 application.workflow_filepath],
                 stdout=subprocess.PIPE,
                 stdin=subprocess.PIPE)
 
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 a17b59d97dd3e71bbda4c874568b0208eedcf7f7..cacf0adb3d5f11030e2bf3db661d4b730528afb3 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
@@ -19,18 +19,17 @@ except ImportError:
 class TestDakotaCommunicator(unittest.TestCase):
     def test_receive_from_mco(self):
         bundle = DummyDakotaBundle()
-        mock_application = mock.Mock(spec=BDSSApplication)
         mock_parameter_factory = mock.Mock(spec=BaseMCOParameterFactory)
         model = bundle.create_model()
         model.parameters = [
             RangedMCOParameter(mock_parameter_factory)
         ]
-        comm = bundle.create_communicator(mock_application, model)
+        comm = bundle.create_communicator()
 
         with mock.patch("sys.stdin") as stdin:
             stdin.read.return_value = "1"
 
-            data = comm.receive_from_mco()
+            data = comm.receive_from_mco(model)
             self.assertIsInstance(data, DataSourceParameters)
             self.assertEqual(len(data.value_names), 1)
             self.assertEqual(len(data.value_types), 1)
diff --git a/force_bdss/core_plugins/dummy/dummy_plugin.py b/force_bdss/core_plugins/dummy/dummy_plugin.py
index 3eca5b37262bfaab0416ee01c82e5287e5455a2f..b62845d4a18d325179173a8cfc4d9b35d15b1f2d 100644
--- a/force_bdss/core_plugins/dummy/dummy_plugin.py
+++ b/force_bdss/core_plugins/dummy/dummy_plugin.py
@@ -10,12 +10,12 @@ from .dummy_kpi_calculator.dummy_kpi_calculator_bundle import (
 
 class DummyPlugin(BaseExtensionPlugin):
     def _data_source_bundles_default(self):
-        return [DummyDataSourceBundle(),
-                CSVExtractorBundle()]
+        return [DummyDataSourceBundle(self),
+                CSVExtractorBundle(self)]
 
     def _mco_bundles_default(self):
-        return [DummyDakotaBundle()]
+        return [DummyDakotaBundle(self)]
 
     def _kpi_calculator_bundles_default(self):
-        return [DummyKPICalculatorBundle(),
-                KPIAdderBundle()]
+        return [DummyKPICalculatorBundle(self),
+                KPIAdderBundle(self)]
diff --git a/force_bdss/data_sources/base_data_source_bundle.py b/force_bdss/data_sources/base_data_source_bundle.py
index ab53763fd294b025edfefd25b90e8ff200227641..422de86f604bb803d248a86a8c9ea99ef9e432c9 100644
--- a/force_bdss/data_sources/base_data_source_bundle.py
+++ b/force_bdss/data_sources/base_data_source_bundle.py
@@ -1,5 +1,6 @@
 import abc
-from traits.api import ABCHasStrictTraits, provides, String
+from traits.api import ABCHasStrictTraits, provides, String, Instance
+from envisage.plugin import Plugin
 
 from .i_data_source_bundle import IDataSourceBundle
 
@@ -18,6 +19,12 @@ class BaseDataSourceBundle(ABCHasStrictTraits):
     #: A human readable name of the bundle. Spaces allowed
     name = String()
 
+    plugin = Instance(Plugin)
+
+    def __init__(self, plugin, *args, **kwargs):
+        self.plugin = plugin
+        super(BaseDataSourceBundle, self).__init__(*args, **kwargs)
+
     @abc.abstractmethod
     def create_data_source(self, application, model):
         """Factory method.
diff --git a/force_bdss/kpi/base_kpi_calculator_bundle.py b/force_bdss/kpi/base_kpi_calculator_bundle.py
index 5ae40637ebae8a75b0fed7089cfa6a629383e11c..756b70d7cf06d5cb4fe3ef329d0ee7aacab2e24e 100644
--- a/force_bdss/kpi/base_kpi_calculator_bundle.py
+++ b/force_bdss/kpi/base_kpi_calculator_bundle.py
@@ -1,5 +1,6 @@
 import abc
-from traits.api import ABCHasStrictTraits, provides, String
+from envisage.plugin import Plugin
+from traits.api import ABCHasStrictTraits, provides, String, Instance
 
 from .i_kpi_calculator_bundle import IKPICalculatorBundle
 
@@ -19,6 +20,12 @@ class BaseKPICalculatorBundle(ABCHasStrictTraits):
     #: A UI friendly name for the bundle. Can contain spaces.
     name = String()
 
+    plugin = Instance(Plugin)
+
+    def __init__(self, plugin, *args, **kwargs):
+        self.plugin = plugin
+        super(BaseKPICalculatorBundle, self).__init__(*args, **kwargs)
+
     @abc.abstractmethod
     def create_kpi_calculator(self, application, model):
         """Factory method.
diff --git a/force_bdss/mco/base_mco.py b/force_bdss/mco/base_mco.py
index a562f1ca35020a3dee7a9fd5d9e16501c83927da..30d162663b41989386a8a3a76fcc5055d6cd8051 100644
--- a/force_bdss/mco/base_mco.py
+++ b/force_bdss/mco/base_mco.py
@@ -2,8 +2,6 @@ import abc
 
 from traits.api import ABCHasStrictTraits, Instance
 
-from ..bdss_application import BDSSApplication
-from .base_mco_model import BaseMCOModel
 from .i_mco_bundle import IMCOBundle
 
 
@@ -14,18 +12,12 @@ class BaseMCO(ABCHasStrictTraits):
     """
     #: A reference to the bundle
     bundle = Instance(IMCOBundle)
-    #: A reference to the application
-    application = Instance(BDSSApplication)
-    #: A reference to the model class
-    model = Instance(BaseMCOModel)
 
-    def __init__(self, bundle, application, model, *args, **kwargs):
+    def __init__(self, bundle, *args, **kwargs):
         self.bundle = bundle
-        self.application = application
-        self.model = model
         super(BaseMCO, self).__init__(*args, **kwargs)
 
     @abc.abstractmethod
-    def run(self):
+    def run(self, model):
         """Reimplement this method to perform the MCO operations."""
         pass
diff --git a/force_bdss/mco/base_mco_bundle.py b/force_bdss/mco/base_mco_bundle.py
index 8eb366d51cdaf6bf293e0a3412116b19ca0d12c3..2fb6fbb3b485796acbe69c279b324061bc8bd164 100644
--- a/force_bdss/mco/base_mco_bundle.py
+++ b/force_bdss/mco/base_mco_bundle.py
@@ -1,9 +1,9 @@
 import abc
 
-from traits.api import ABCHasStrictTraits, String
-from traits.has_traits import provides
+from traits.api import ABCHasStrictTraits, String, provides, Instance
+from envisage.plugin import Plugin
 
-from force_bdss.mco.i_mco_bundle import IMCOBundle
+from .i_mco_bundle import IMCOBundle
 
 
 @provides(IMCOBundle)
@@ -19,8 +19,14 @@ class BaseMCOBundle(ABCHasStrictTraits):
     #: A user friendly name of the bundle. Spaces allowed.
     name = String()
 
+    plugin = Instance(Plugin)
+
+    def __init__(self, plugin, *args, **kwargs):
+        self.plugin = plugin
+        super(BaseMCOBundle, self).__init__(*args, **kwargs)
+
     @abc.abstractmethod
-    def create_optimizer(self, application, model):
+    def create_optimizer(self):
         """Factory method.
         Creates the optimizer with the given application
         and model and returns it to the caller.
@@ -60,7 +66,7 @@ class BaseMCOBundle(ABCHasStrictTraits):
         """
 
     @abc.abstractmethod
-    def create_communicator(self, application, model):
+    def create_communicator(self):
         """Factory method. Returns the communicator class that allows
         exchange between the MCO and the evaluator code.
 
diff --git a/force_bdss/mco/base_mco_communicator.py b/force_bdss/mco/base_mco_communicator.py
index 873da9f28200be1fab481a481b37517e5c32275f..aaa539b85f36d887ad2b5e8b08da3c69aa003c77 100644
--- a/force_bdss/mco/base_mco_communicator.py
+++ b/force_bdss/mco/base_mco_communicator.py
@@ -20,18 +20,12 @@ class BaseMCOCommunicator(ABCHasStrictTraits):
     """
     #: A reference to the bundle
     bundle = Instance(IMCOBundle)
-    #: A reference to the application
-    application = Instance(BDSSApplication)
-    #: A reference to the model class
-    model = Instance(BaseMCOModel)
 
-    def __init__(self, bundle, application, model):
+    def __init__(self, bundle):
         self.bundle = bundle
-        self.application = application
-        self.model = model
 
     @abc.abstractmethod
-    def receive_from_mco(self):
+    def receive_from_mco(self, model):
         """
         Receives the parameters from the MCO.
         The conversion is specific to the format of the communication
@@ -48,7 +42,7 @@ class BaseMCOCommunicator(ABCHasStrictTraits):
         """
 
     @abc.abstractmethod
-    def send_to_mco(self, kpi_results):
+    def send_to_mco(self, model, kpi_results):
         """Send the KPI results from the evaluation to the MCO
         Must be reimplemented to perform the conversion between the
         two formats. This is of course dependent on the specifics of the
diff --git a/force_bdss/mco/i_mco_bundle.py b/force_bdss/mco/i_mco_bundle.py
index dd7e1b9a42fe9c01f5914dcf3a70acfe84dbc79d..3e0c19947890d7b8c2d2ba4c1d87dabb354aa4a4 100644
--- a/force_bdss/mco/i_mco_bundle.py
+++ b/force_bdss/mco/i_mco_bundle.py
@@ -9,11 +9,11 @@ class IMCOBundle(Interface):
 
     name = String()
 
-    def create_optimizer(self, application, model):
+    def create_optimizer(self):
         pass
 
     def create_model(self, model_data=None):
         pass
 
-    def create_communicator(self, application, model):
+    def create_communicator(self):
         pass
diff --git a/force_bdss/mco/tests/test_base_mco.py b/force_bdss/mco/tests/test_base_mco.py
index f228f32508891ad0a599d174a67d96e2eb63cba0..e5e9130a5d9bfa3cc3081c12179d5e3531f0cddb 100644
--- a/force_bdss/mco/tests/test_base_mco.py
+++ b/force_bdss/mco/tests/test_base_mco.py
@@ -1,6 +1,5 @@
 import unittest
 
-from force_bdss.mco.base_mco_model import BaseMCOModel
 from force_bdss.mco.base_mco import BaseMCO
 from force_bdss.mco.i_mco_bundle import IMCOBundle
 
@@ -9,21 +8,15 @@ try:
 except ImportError:
     from unittest import mock
 
-from force_bdss.bdss_application import BDSSApplication
-
 
 class DummyMCO(BaseMCO):
-    def run(self, *args, **kwargs):
+    def run(self, model, *args, **kwargs):
         pass
 
 
 class TestBaseMultiCriteriaOptimizer(unittest.TestCase):
     def test_initialization(self):
         bundle = mock.Mock(spec=IMCOBundle)
-        application = mock.Mock(spec=BDSSApplication)
-        model = mock.Mock(spec=BaseMCOModel)
-        mco = DummyMCO(bundle, application, model)
+        mco = DummyMCO(bundle)
 
         self.assertEqual(mco.bundle, bundle)
-        self.assertEqual(mco.application, application)
-        self.assertEqual(mco.model, model)
diff --git a/force_bdss/mco/tests/test_base_mco_communicator.py b/force_bdss/mco/tests/test_base_mco_communicator.py
index 7cd7a25288c4306f2b592d23af02d261d86c2b51..5769444dba7d6884a337f25a4d49dece4c20b0eb 100644
--- a/force_bdss/mco/tests/test_base_mco_communicator.py
+++ b/force_bdss/mco/tests/test_base_mco_communicator.py
@@ -1,7 +1,6 @@
 import unittest
 
 from force_bdss.mco.base_mco_communicator import BaseMCOCommunicator
-from force_bdss.mco.base_mco_model import BaseMCOModel
 from force_bdss.mco.i_mco_bundle import IMCOBundle
 
 try:
@@ -9,24 +8,18 @@ try:
 except ImportError:
     from unittest import mock
 
-from force_bdss.bdss_application import BDSSApplication
-
 
 class DummyMCOCommunicator(BaseMCOCommunicator):
-    def receive_from_mco(self):
+    def receive_from_mco(self, model):
         pass
 
-    def send_to_mco(self, kpi_results):
+    def send_to_mco(self, model, kpi_results):
         pass
 
 
 class TestBaseMCOCommunicator(unittest.TestCase):
     def test_initialization(self):
         bundle = mock.Mock(spec=IMCOBundle)
-        application = mock.Mock(spec=BDSSApplication)
-        model = mock.Mock(spec=BaseMCOModel)
-        mcocomm = DummyMCOCommunicator(bundle, application, model)
+        mcocomm = DummyMCOCommunicator(bundle)
 
         self.assertEqual(mcocomm.bundle, bundle)
-        self.assertEqual(mcocomm.application, application)
-        self.assertEqual(mcocomm.model, model)