diff --git a/force_bdss/core_plugins/dummy/__init__.py b/force_bdss/core_plugins/dummy/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/__init__.py b/force_bdss/core_plugins/dummy/dummy_dakota/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d3bfacb035c7a978e5d331d790f5f37499dddcb
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py
@@ -0,0 +1,23 @@
+from traits.api import String
+from force_bdss.api import bundle_id, BaseMultiCriteriaOptimizerBundle
+
+from .dakota_communicator import DummyDakotaCommunicator
+from .dakota_model import DummyDakotaModel
+from .dakota_optimizer import DummyDakotaOptimizer
+
+
+class DummyDakotaBundle(BaseMultiCriteriaOptimizerBundle):
+    id = String(bundle_id("enthought", "dummy_dakota"))
+
+    name = "Dummy Dakota"
+
+    def create_model(self, model_data=None):
+        if model_data is None:
+            model_data = {}
+        return DummyDakotaModel(self, **model_data)
+
+    def create_optimizer(self, application, model):
+        return DummyDakotaOptimizer(self, application, model)
+
+    def create_communicator(self, application, model):
+        return DummyDakotaCommunicator(self, application, model)
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
new file mode 100644
index 0000000000000000000000000000000000000000..dfcc11349ec3a2db0093958f096267340f619966
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py
@@ -0,0 +1,20 @@
+import sys
+import numpy
+
+from force_bdss.api import DataSourceParameters, BaseMCOCommunicator
+
+
+class DummyDakotaCommunicator(BaseMCOCommunicator):
+    def receive_from_mco(self):
+        data = sys.stdin.read()
+        values = list(map(float, data.split()))
+        return DataSourceParameters(
+            value_types=["DUMMY"]*len(values),
+            values=numpy.array(values)
+        )
+
+    def send_to_mco(self, kpi_results):
+        data = " ".join(
+            [" ".join(list(map(str, r.values.tolist()))) for r in kpi_results]
+        )
+        sys.stdout.write(data)
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_model.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..65150979e82bf7dfe79074baf5f978053a23ef1b
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_model.py
@@ -0,0 +1,5 @@
+from force_bdss.api import BaseMCOModel
+
+
+class DummyDakotaModel(BaseMCOModel):
+    pass
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..e91edb5b3146f94c3b30cc2eb79ac0f7d70c3ba5
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py
@@ -0,0 +1,20 @@
+import subprocess
+
+import sys
+
+from force_bdss.api import BaseMultiCriteriaOptimizer
+
+
+class DummyDakotaOptimizer(BaseMultiCriteriaOptimizer):
+    def run(self):
+        print("Running dakota optimizer")
+        for initial_value in range(10):
+            ps = subprocess.Popen(
+                [sys.argv[0],
+                 "--evaluate",
+                 self.application.workflow_filepath],
+                stdout=subprocess.PIPE,
+                stdin=subprocess.PIPE)
+
+            out = ps.communicate("{}".format(initial_value).encode("utf-8"))
+            print("{}: {}".format(initial_value, out[0].decode("utf-8")))
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
new file mode 100644
index 0000000000000000000000000000000000000000..20004b3a933fd6eba0da31a6069277d930aa36ea
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py
@@ -0,0 +1,11 @@
+from force_bdss.api import BaseDataSource, DataSourceResult
+
+
+class DummyDataSource(BaseDataSource):
+    def run(self, parameters):
+        print(parameters)
+        return DataSourceResult(
+                originator=self,
+                value_types=parameters.value_types,
+                values=parameters.values.reshape(
+                    parameters.values.shape + (1,)))
diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_bundle.py b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebebc00c4ad9e6b9b8278cbfa6978c849e68cc78
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_bundle.py
@@ -0,0 +1,16 @@
+from force_bdss.api import BaseDataSourceBundle, bundle_id
+from .dummy_data_source_model import DummyDataSourceModel
+from .dummy_data_source import DummyDataSource
+
+
+class DummyDataSourceBundle(BaseDataSourceBundle):
+    id = bundle_id("enthought", "dummy_data_source")
+
+    def create_model(self, model_data=None):
+        if model_data is None:
+            model_data = {}
+
+        return DummyDataSourceModel(self, **model_data)
+
+    def create_data_source(self, application, model):
+        return DummyDataSource(self, application, model)
diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_model.py b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..a79145f9bd9966a4834edb8ede4e89aa5500cebc
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_model.py
@@ -0,0 +1,5 @@
+from force_bdss.api import BaseDataSourceModel
+
+
+class DummyDataSourceModel(BaseDataSourceModel):
+    pass
diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/__init__.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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
new file mode 100644
index 0000000000000000000000000000000000000000..aeee46827562c20ecb61ca87f7cd5ef2cac9fc05
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py
@@ -0,0 +1,12 @@
+from force_bdss.api import BaseKPICalculator, KPICalculatorResult, bundle_id
+
+
+class DummyKPICalculator(BaseKPICalculator):
+    id = bundle_id("enthought", "dummy_kpi_calculator")
+
+    def run(self, data_source_results):
+        return KPICalculatorResult(
+            originator=self,
+            value_types=data_source_results[0].value_types,
+            values=data_source_results[0].values.reshape(
+                data_source_results[0].values.shape[:-1]))
diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_bundle.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2c567bc6852c7779a6799b2c026b2cda2995756
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_bundle.py
@@ -0,0 +1,19 @@
+from traits.api import String
+from force_bdss.api import bundle_id, BaseKPICalculatorBundle
+from .dummy_kpi_calculator import DummyKPICalculator
+from .dummy_kpi_calculator_model import DummyKPICalculatorModel
+
+
+class DummyKPICalculatorBundle(BaseKPICalculatorBundle):
+    id = String(bundle_id("enthought", "dummy_kpi_calculator"))
+
+    name = String("Dummy KPI")
+
+    def create_model(self, model_data=None):
+        if model_data is None:
+            model_data = {}
+
+        return DummyKPICalculatorModel(self, **model_data)
+
+    def create_kpi_calculator(self, application, model):
+        return DummyKPICalculator(self, application, model)
diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_model.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..d72ee3f4556297d5ce718fbfaf6b8e555e018d8d
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_model.py
@@ -0,0 +1,5 @@
+from force_bdss.api import BaseKPICalculatorModel
+
+
+class DummyKPICalculatorModel(BaseKPICalculatorModel):
+    pass
diff --git a/force_bdss/core_plugins/dummy/dummy_plugin.py b/force_bdss/core_plugins/dummy/dummy_plugin.py
new file mode 100644
index 0000000000000000000000000000000000000000..01850726513c44d0f888bbb610b5b0da3a991ff4
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_plugin.py
@@ -0,0 +1,17 @@
+from force_bdss.api import BaseExtensionPlugin
+from .dummy_dakota.dakota_bundle import DummyDakotaBundle
+from .dummy_data_source.dummy_data_source_bundle import DummyDataSourceBundle
+from .dummy_kpi_calculator.dummy_kpi_calculator_bundle import (
+    DummyKPICalculatorBundle
+)
+
+
+class DummyPlugin(BaseExtensionPlugin):
+    def _data_source_bundles_default(self):
+        return [DummyDataSourceBundle()]
+
+    def _mco_bundles_default(self):
+        return [DummyDakotaBundle()]
+
+    def _kpi_calculator_bundles_default(self):
+        return [DummyKPICalculatorBundle()]
diff --git a/setup.py b/setup.py
index 19b2c6aa22c8b83e91c3d48dfa550c0c6900726b..28dc7d9729bb3de994b6abf8c9a12636082b1080 100644
--- a/setup.py
+++ b/setup.py
@@ -16,6 +16,7 @@ setup(
             ".csv_extractor_plugin:CSVExtractorPlugin",
             "kpi_adder = force_bdss.core_plugins.dummy_kpi"
             ".dummy_kpi_calculator_plugin:DummyKPICalculatorPlugin",
+            "dummy = force_bdss.core_plugins.dummy.dummy_plugin:DummyPlugin",
         ]
     },
     packages=find_packages(),