diff --git a/force_bdss/core_plugins/dummy/csv_extractor/tests/__init__.py b/force_bdss/core_plugins/dummy/csv_extractor/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_bundle.py b/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5a563f889a698c349918bccd5b38f30dd445a20
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_bundle.py
@@ -0,0 +1,24 @@
+import unittest
+
+from force_bdss.core_plugins.dummy.tests.data_source_bundle_test_mixin import \
+    DataSourceBundleTestMixin
+from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_bundle import \
+    CSVExtractorBundle
+from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_data_source \
+    import CSVExtractorDataSource
+from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_model import \
+    CSVExtractorModel
+
+
+class TestCSVExtractorBundle(DataSourceBundleTestMixin, unittest.TestCase):
+    @property
+    def bundle_class(self):
+        return CSVExtractorBundle
+
+    @property
+    def model_class(self):
+        return CSVExtractorModel
+
+    @property
+    def data_source_class(self):
+        return CSVExtractorDataSource
diff --git a/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py b/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py
new file mode 100644
index 0000000000000000000000000000000000000000..1be1beb2559ce8aaa208b6bad69ba94718cb7b4a
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/csv_extractor/tests/test_csv_extractor_data_source.py
@@ -0,0 +1,33 @@
+import unittest
+
+from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_data_source \
+    import CSVExtractorDataSource
+from force_bdss.core_plugins.dummy.csv_extractor.csv_extractor_model import \
+    CSVExtractorModel
+from force_bdss.data_sources.base_data_source_bundle import \
+    BaseDataSourceBundle
+from force_bdss.data_sources.data_source_result import DataSourceResult
+from force_bdss.tests import fixtures
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+
+class TestCSVExtractorDataSource(unittest.TestCase):
+    def setUp(self):
+        self.bundle = mock.Mock(spec=BaseDataSourceBundle)
+
+    def test_initialization(self):
+        ds = CSVExtractorDataSource(self.bundle)
+        self.assertEqual(ds.bundle, self.bundle)
+
+    def test_run(self):
+        ds = CSVExtractorDataSource(self.bundle)
+        model = CSVExtractorModel(self.bundle)
+        model.filename = fixtures.get("foo.csv")
+        mock_params = mock.Mock()
+        mock_params.values = [1.0]
+        result = ds.run(model, mock_params)
+        self.assertIsInstance(result, DataSourceResult)
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/tests/__init__.py b/force_bdss/core_plugins/dummy/dummy_dakota/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_bundle.py b/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..b455c6d08d6e21659b0cb2346a41823b505f8c74
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_dakota/tests/test_dakota_bundle.py
@@ -0,0 +1,43 @@
+import unittest
+
+from envisage.plugin import Plugin
+
+from force_bdss.core_plugins.dummy.dummy_dakota.dakota_bundle import \
+    DummyDakotaBundle
+from force_bdss.core_plugins.dummy.dummy_dakota.dakota_model import \
+    DummyDakotaModel
+from force_bdss.core_plugins.dummy.dummy_dakota.dakota_optimizer import \
+    DummyDakotaOptimizer
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+
+class TestDakotaBundle(unittest.TestCase):
+    def setUp(self):
+        self.plugin = mock.Mock(spec=Plugin)
+
+    def test_initialization(self):
+        bundle = DummyDakotaBundle(self.plugin)
+        self.assertIn("dummy_dakota", bundle.id)
+        self.assertEqual(bundle.plugin, self.plugin)
+
+    def test_create_model(self):
+        bundle = DummyDakotaBundle(self.plugin)
+        model = bundle.create_model({})
+        self.assertIsInstance(model, DummyDakotaModel)
+
+        model = bundle.create_model()
+        self.assertIsInstance(model, DummyDakotaModel)
+
+    def test_create_mco(self):
+        bundle = DummyDakotaBundle(self.plugin)
+        ds = bundle.create_optimizer()
+        self.assertIsInstance(ds, DummyDakotaOptimizer)
+
+    def test_create_communicator(self):
+        bundle = DummyDakotaBundle(self.plugin)
+        ds = bundle.create_optimizer()
+        self.assertIsInstance(ds, DummyDakotaOptimizer)
diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/tests/__init__.py b/force_bdss/core_plugins/dummy/dummy_data_source/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/tests/test_dummy_data_source.py b/force_bdss/core_plugins/dummy/dummy_data_source/tests/test_dummy_data_source.py
new file mode 100644
index 0000000000000000000000000000000000000000..a77e99a6f1b2730222a73ad6d369beb071f8151b
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_data_source/tests/test_dummy_data_source.py
@@ -0,0 +1,19 @@
+import unittest
+
+from force_bdss.data_sources.base_data_source_bundle import \
+    BaseDataSourceBundle
+from force_bdss.data_sources.tests.test_base_data_source import DummyDataSource
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+
+class TestDummyDataSource(unittest.TestCase):
+    def setUp(self):
+        self.bundle = mock.Mock(spec=BaseDataSourceBundle)
+
+    def test_initialization(self):
+        ds = DummyDataSource(self.bundle)
+        self.assertEqual(ds.bundle, self.bundle)
diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/tests/test_dummy_data_source_bundle.py b/force_bdss/core_plugins/dummy/dummy_data_source/tests/test_dummy_data_source_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..617c4edfd73c77c2144f30e04d4473a0eadd4a22
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/dummy_data_source/tests/test_dummy_data_source_bundle.py
@@ -0,0 +1,24 @@
+import unittest
+
+from force_bdss.core_plugins.dummy.dummy_data_source.dummy_data_source import \
+    DummyDataSource
+from force_bdss.core_plugins.dummy.dummy_data_source\
+    .dummy_data_source_bundle import DummyDataSourceBundle
+from force_bdss.core_plugins.dummy.dummy_data_source.dummy_data_source_model\
+    import DummyDataSourceModel
+from force_bdss.core_plugins.dummy.tests.data_source_bundle_test_mixin import \
+    DataSourceBundleTestMixin
+
+
+class TestDummyDataSourceBundle(DataSourceBundleTestMixin, unittest.TestCase):
+    @property
+    def bundle_class(self):
+        return DummyDataSourceBundle
+
+    @property
+    def model_class(self):
+        return DummyDataSourceModel
+
+    @property
+    def data_source_class(self):
+        return DummyDataSource
diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/tests/__init__.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/kpi_adder/tests/__init__.py b/force_bdss/core_plugins/dummy/kpi_adder/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/tests/__init__.py b/force_bdss/core_plugins/dummy/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/core_plugins/dummy/tests/data_source_bundle_test_mixin.py b/force_bdss/core_plugins/dummy/tests/data_source_bundle_test_mixin.py
new file mode 100644
index 0000000000000000000000000000000000000000..011a2b3f99f00b176810426b2687942092778fe7
--- /dev/null
+++ b/force_bdss/core_plugins/dummy/tests/data_source_bundle_test_mixin.py
@@ -0,0 +1,44 @@
+from envisage.plugin import Plugin
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+
+class DataSourceBundleTestMixin(object):
+    def setUp(self):
+        self.plugin = mock.Mock(spec=Plugin)
+        super(DataSourceBundleTestMixin, self).setUp()
+
+    # Note: we can't use metaclasses. Apparently using six.with_metaclass
+    # breaks the unittest TestCase mechanism. py3 metaclassing works.
+    @property
+    def bundle_class(self):
+        raise NotImplementedError()
+
+    @property
+    def model_class(self):
+        raise NotImplementedError()
+
+    @property
+    def data_source_class(self):
+        raise NotImplementedError()
+
+    def test_initialization(self):
+        bundle = self.bundle_class(self.plugin)
+        self.assertNotEqual(bundle.id, "")
+        self.assertEqual(bundle.plugin, self.plugin)
+
+    def test_create_model(self):
+        bundle = self.bundle_class(self.plugin)
+        model = bundle.create_model({})
+        self.assertIsInstance(model, self.model_class)
+
+        model = bundle.create_model()
+        self.assertIsInstance(model, self.model_class)
+
+    def test_create_data_source(self):
+        bundle = self.bundle_class(self.plugin)
+        ds = bundle.create_data_source()
+        self.assertIsInstance(ds, self.data_source_class)