diff --git a/force_bdss/data_sources/base_data_source.py b/force_bdss/data_sources/base_data_source.py
index c700ea861daeaeb670451137b70f09ad8c065966..07a5ee9467db3488bf84f16770c756060f806771 100644
--- a/force_bdss/data_sources/base_data_source.py
+++ b/force_bdss/data_sources/base_data_source.py
@@ -1,24 +1,37 @@
+from traits.api import ABCHasStrictTraits, Instance
 import abc
-import six
 
+from .base_data_source_model import BaseDataSourceModel
+from ..bdss_application import BDSSApplication
+from ..data_sources.i_data_source_bundle import IDataSourceBundle
 
-class BaseDataSource(six.with_metaclass(abc.ABCMeta)):
+
+class BaseDataSource(ABCHasStrictTraits):
     """Base class for the DataSource, any computational engine/retriever
     for data.
 
     Inherit from this class for your specific DataSource.
     """
-    def __init__(self, bundle, application, model):
+    #: A reference to the bundle
+    bundle = Instance(IDataSourceBundle)
+    #: A reference to the application
+    application = Instance(BDSSApplication)
+    #: A reference to the model class
+    model = Instance(BaseDataSourceModel)
+
+    def __init__(self, bundle, application, model, *args, **kwargs):
         self.bundle = bundle
         self.application = application
         self.model = model
+        super(BaseDataSource, self).__init__(*args, **kwargs)
 
     @property
     def name(self):
+        """Utility property to retrieve the bundle name from the data source
+        object."""
         return self.bundle.name
 
     @abc.abstractmethod
     def run(self, parameters):
         """Executes the data source evaluation/fetching and returns
         the list of results as a DataSourceResult instance."""
-        pass
diff --git a/force_bdss/data_sources/tests/__init__.py b/force_bdss/data_sources/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/data_sources/tests/test_base_data_source.py b/force_bdss/data_sources/tests/test_base_data_source.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4784fb31f4fd47184eb021e758443d959e03292
--- /dev/null
+++ b/force_bdss/data_sources/tests/test_base_data_source.py
@@ -0,0 +1,29 @@
+import unittest
+
+from force_bdss.data_sources.base_data_source import BaseDataSource
+from force_bdss.data_sources.base_data_source_model import BaseDataSourceModel
+from force_bdss.data_sources.i_data_source_bundle import IDataSourceBundle
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from force_bdss.bdss_application import BDSSApplication
+
+
+class DummyDataSource(BaseDataSource):
+    def run(self, *args, **kwargs):
+        pass
+
+
+class TestBaseDataSource(unittest.TestCase):
+    def test_initialization(self):
+        bundle = mock.Mock(spec=IDataSourceBundle)
+        application = mock.Mock(spec=BDSSApplication)
+        model = mock.Mock(spec=BaseDataSourceModel)
+        ds = DummyDataSource(bundle, application, model)
+
+        self.assertEqual(ds.bundle, bundle)
+        self.assertEqual(ds.application, application)
+        self.assertEqual(ds.model, model)
diff --git a/force_bdss/kpi/base_kpi_calculator.py b/force_bdss/kpi/base_kpi_calculator.py
index 5e67d149216292b3a516e4488b4ae85e28e753da..0a9a2e0cd3e83ac8b4a074c551f7aed75867246b 100644
--- a/force_bdss/kpi/base_kpi_calculator.py
+++ b/force_bdss/kpi/base_kpi_calculator.py
@@ -1,18 +1,44 @@
 import abc
-import six
 
+from traits.api import ABCHasStrictTraits, Instance
 
-class BaseKPICalculator(six.with_metaclass(abc.ABCMeta)):
-    def __init__(self, bundle, application, model):
+from ..bdss_application import BDSSApplication
+from .base_kpi_calculator_model import BaseKPICalculatorModel
+from .i_kpi_calculator_bundle import IKPICalculatorBundle
+
+
+class BaseKPICalculator(ABCHasStrictTraits):
+    """Base class for the KPICalculators.
+
+    Inherit this class for your KPI calculator.
+    """
+    #: A reference to the bundle
+    bundle = Instance(IKPICalculatorBundle)
+    #: A reference to the application
+    application = Instance(BDSSApplication)
+    #: A reference to the model class
+    model = Instance(BaseKPICalculatorModel)
+
+    def __init__(self, bundle, application, model, *args, **kwargs):
         self.bundle = bundle
         self.application = application
         self.model = model
+        super(BaseKPICalculator, self).__init__(*args, **kwargs)
 
     @property
     def name(self):
+        """Convenience property. Returns the name of the originating bundle."""
         return self.bundle.name
 
     @abc.abstractmethod
     def run(self, data_source_results):
-        """Executes the KPI evaluation and returns the list of results."""
-        pass
+        """
+        Executes the KPI evaluation and returns the list of results.
+        Reimplement this method in your specific KPI calculator.
+
+        Parameters
+        ----------
+        data_source_results:
+            a list of DataSourceResult instances containing the results of the
+            evaluation.
+        """
diff --git a/force_bdss/kpi/tests/__init__.py b/force_bdss/kpi/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/kpi/tests/test_base_kpi_calculator.py b/force_bdss/kpi/tests/test_base_kpi_calculator.py
new file mode 100644
index 0000000000000000000000000000000000000000..512f51fdfe685aaf58296213548ec1a0b12c48cc
--- /dev/null
+++ b/force_bdss/kpi/tests/test_base_kpi_calculator.py
@@ -0,0 +1,27 @@
+import unittest
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from force_bdss.bdss_application import BDSSApplication
+from force_bdss.kpi.base_kpi_calculator_model import BaseKPICalculatorModel
+from force_bdss.kpi.base_kpi_calculator import BaseKPICalculator
+from force_bdss.kpi.i_kpi_calculator_bundle import IKPICalculatorBundle
+
+
+class DummyKPICalculator(BaseKPICalculator):
+    def run(self, *args, **kwargs):
+        pass
+
+
+class TestBaseKPICalculator(unittest.TestCase):
+    def test_initialization(self):
+        bundle = mock.Mock(spec=IKPICalculatorBundle)
+        application = mock.Mock(spec=BDSSApplication)
+        model = mock.Mock(spec=BaseKPICalculatorModel)
+        kpic = DummyKPICalculator(bundle, application, model)
+
+        self.assertEqual(kpic.bundle, bundle)
+        self.assertEqual(kpic.application, application)
+        self.assertEqual(kpic.model, model)
diff --git a/force_bdss/mco/base_multi_criteria_optimizer.py b/force_bdss/mco/base_multi_criteria_optimizer.py
index 5930c5ca5ecc0528e6e8effdf262d45f213f117f..6dd3462260517368527aa9a53582169792033deb 100644
--- a/force_bdss/mco/base_multi_criteria_optimizer.py
+++ b/force_bdss/mco/base_multi_criteria_optimizer.py
@@ -1,17 +1,37 @@
 import abc
-import six
 
+from traits.api import ABCHasStrictTraits, Instance
 
-class BaseMultiCriteriaOptimizer(six.with_metaclass(abc.ABCMeta)):
-    def __init__(self, bundle, application, model):
+from ..bdss_application import BDSSApplication
+from .base_mco_model import BaseMCOModel
+from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle
+
+
+class BaseMultiCriteriaOptimizer(ABCHasStrictTraits):
+    """Base class for the Multi Criteria Optimizer.
+
+    Inherit this class for your MCO implementation
+    """
+    #: A reference to the bundle
+    bundle = Instance(IMultiCriteriaOptimizerBundle)
+    #: 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):
         self.bundle = bundle
         self.application = application
         self.model = model
+        super(BaseMultiCriteriaOptimizer, self).__init__(*args, **kwargs)
 
     @property
     def name(self):
+        """Convenience property to return the name of the bundle from the
+        MCO itself"""
         return self.bundle.name
 
     @abc.abstractmethod
     def run(self):
+        """Reimplement this method to perform the MCO operations."""
         pass
diff --git a/force_bdss/mco/tests/__init__.py b/force_bdss/mco/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/force_bdss/mco/tests/test_base_multi_criteria_optimizer.py b/force_bdss/mco/tests/test_base_multi_criteria_optimizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..cab26edf81e35a21d5f0fd73d0669f2dea69a0d9
--- /dev/null
+++ b/force_bdss/mco/tests/test_base_multi_criteria_optimizer.py
@@ -0,0 +1,31 @@
+import unittest
+
+from force_bdss.mco.base_mco_model import BaseMCOModel
+from force_bdss.mco.base_multi_criteria_optimizer import \
+    BaseMultiCriteriaOptimizer
+from force_bdss.mco.i_multi_criteria_optimizer_bundle import \
+    IMultiCriteriaOptimizerBundle
+
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from force_bdss.bdss_application import BDSSApplication
+
+
+class DummyMCO(BaseMultiCriteriaOptimizer):
+    def run(self, *args, **kwargs):
+        pass
+
+
+class TestBaseKPICalculator(unittest.TestCase):
+    def test_initialization(self):
+        bundle = mock.Mock(spec=IMultiCriteriaOptimizerBundle)
+        application = mock.Mock(spec=BDSSApplication)
+        model = mock.Mock(spec=BaseMCOModel)
+        mco = DummyMCO(bundle, application, model)
+
+        self.assertEqual(mco.bundle, bundle)
+        self.assertEqual(mco.application, application)
+        self.assertEqual(mco.model, model)