diff --git a/force_bdss/api.py b/force_bdss/api.py
index 1a5aeedfb60db42e6d1e728a3d5a15d64350fe00..939e8cf49e1d2d90bcb3aa451111a80cc2606399 100644
--- a/force_bdss/api.py
+++ b/force_bdss/api.py
@@ -1,15 +1,19 @@
 from .base_extension_plugin import BaseExtensionPlugin  # noqa
 from .id_generators import bundle_id  # noqa
-from .data_sources.i_data_source_bundle import IDataSourceBundle  # noqa
-from .mco.i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle  # noqa
-from .kpi.i_kpi_calculator_bundle import IKPICalculatorBundle  # noqa
+
 from .data_sources.base_data_source_model import BaseDataSourceModel  # noqa
 from .data_sources.data_source_result import DataSourceResult  # noqa
 from .data_sources.data_source_parameters import DataSourceParameters  # noqa
 from .data_sources.base_data_source import BaseDataSource  # noqa
+from .data_sources.base_data_source_bundle import BaseDataSourceBundle  # noqa
+
 from .kpi.base_kpi_calculator import BaseKPICalculator  # noqa
 from .kpi.kpi_calculator_result import KPICalculatorResult  # noqa
 from .kpi.base_kpi_calculator_model import BaseKPICalculatorModel  # noqa
+from .kpi.base_kpi_calculator_bundle import BaseKPICalculatorBundle  # noqa
+
 from .mco.base_mco_model import BaseMCOModel  # noqa
 from .mco.base_mco_communicator import BaseMCOCommunicator  # noqa
 from .mco.base_multi_criteria_optimizer import BaseMultiCriteriaOptimizer  # noqa
+from .mco.base_multi_criteria_optimizer_bundle import BaseMultiCriteriaOptimizerBundle  # noqa
+
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py
index a44b5e14b65970a1a62d26a7706469a60d13a679..55f998c49c4bfef7dfb37f93f61f3c435f00f518 100644
--- a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py
+++ b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py
@@ -1,15 +1,16 @@
-from traits.api import provides, HasStrictTraits, String
+from traits.api import String
 
-from force_bdss.api import bundle_id, IDataSourceBundle
+from force_bdss.api import bundle_id, BaseDataSourceBundle
 
 from .csv_extractor_model import CSVExtractorModel
 from .csv_extractor_data_source import CSVExtractorDataSource
 
 
-@provides(IDataSourceBundle)
-class CSVExtractorBundle(HasStrictTraits):
+class CSVExtractorBundle(BaseDataSourceBundle):
     id = String(bundle_id("enthought", "csv_extractor"))
 
+    name = String("CSV Extractor")
+
     def create_model(self, model_data=None):
         if model_data is None:
             model_data = {}
diff --git a/force_bdss/core_plugins/dummy_kpi/kpi_adder/kpi_adder_bundle.py b/force_bdss/core_plugins/dummy_kpi/kpi_adder/kpi_adder_bundle.py
index a06cf885d4a2d581768da6c6b71a21e7208763c9..ab40c710bbbff3bbdd5c5a39d62b95414198fbc4 100644
--- a/force_bdss/core_plugins/dummy_kpi/kpi_adder/kpi_adder_bundle.py
+++ b/force_bdss/core_plugins/dummy_kpi/kpi_adder/kpi_adder_bundle.py
@@ -1,16 +1,16 @@
-from traits.api import provides, HasStrictTraits, String
+from traits.api import String
 
-from force_bdss.api import bundle_id
-from force_bdss.api import IKPICalculatorBundle
+from force_bdss.api import bundle_id, BaseKPICalculatorBundle
 
 from .kpi_adder_model import KPIAdderModel
 from .kpi_adder_calculator import KPIAdderCalculator
 
 
-@provides(IKPICalculatorBundle)
-class KPIAdderBundle(HasStrictTraits):
+class KPIAdderBundle(BaseKPICalculatorBundle):
     id = String(bundle_id("enthought", "kpi_adder"))
 
+    name = String("KPI Adder")
+
     def create_model(self, model_data=None):
         if model_data is None:
             model_data = {}
diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_bundle.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_bundle.py
index 07e4dd366a2c964cbf9de4dcace24170feb3bc6c..e4d9f441bf4dbcce63ac1de06a53a56dc35d693b 100644
--- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_bundle.py
+++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_bundle.py
@@ -1,15 +1,16 @@
-from traits.api import HasStrictTraits, provides, String
-from force_bdss.api import bundle_id, IMultiCriteriaOptimizerBundle
+from traits.api import String
+from force_bdss.api import bundle_id, BaseMultiCriteriaOptimizerBundle
 
 from .dakota_communicator import DakotaCommunicator
 from .dakota_model import DakotaModel
 from .dakota_optimizer import DakotaOptimizer
 
 
-@provides(IMultiCriteriaOptimizerBundle)
-class DakotaBundle(HasStrictTraits):
+class DakotaBundle(BaseMultiCriteriaOptimizerBundle):
     id = String(bundle_id("enthought", "dakota"))
 
+    name = "Dakota"
+
     def create_model(self, model_data=None):
         if model_data is None:
             model_data = {}
diff --git a/force_bdss/data_sources/base_data_source_bundle.py b/force_bdss/data_sources/base_data_source_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ad3d7667a738d96eb7cfa0ac107c19a88de7b5b
--- /dev/null
+++ b/force_bdss/data_sources/base_data_source_bundle.py
@@ -0,0 +1,27 @@
+import abc
+from traits.api import ABCHasStrictTraits, provides, String
+
+from .i_data_source_bundle import IDataSourceBundle
+
+
+@provides(IDataSourceBundle)
+class BaseDataSourceBundle(ABCHasStrictTraits):
+    #: Unique identifier that identifies the bundle uniquely in the
+    #: universe of bundles. Create one with the function bundle_id()
+    id = String()
+
+    #: A human readable name of the bundle
+    name = String()
+
+    @abc.abstractmethod
+    def create_data_source(self, application, model):
+        """Factory method.
+        Must return the bundle-specific BaseDataSource instance.
+        """
+        pass
+
+    @abc.abstractmethod
+    def create_model(self, model_data=None):
+        """Factory method.
+        Must return the bundle-specific BaseDataSourceModel instance.
+        """
diff --git a/force_bdss/kpi/base_kpi_calculator_bundle.py b/force_bdss/kpi/base_kpi_calculator_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..75705c70f9f587ab1ea3a550a2f86bcb6e1dd564
--- /dev/null
+++ b/force_bdss/kpi/base_kpi_calculator_bundle.py
@@ -0,0 +1,19 @@
+import abc
+from traits.api import ABCHasStrictTraits, provides, String
+
+from .i_kpi_calculator_bundle import IKPICalculatorBundle
+
+
+@provides(IKPICalculatorBundle)
+class BaseKPICalculatorBundle(ABCHasStrictTraits):
+    id = String()
+
+    name = String()
+
+    @abc.abstractmethod
+    def create_kpi_calculator(self, application, model):
+        pass
+
+    @abc.abstractmethod
+    def create_model(self, model_data=None):
+        pass
diff --git a/force_bdss/kpi/i_kpi_calculator_bundle.py b/force_bdss/kpi/i_kpi_calculator_bundle.py
index d4e8992ba059883f1b8824eb74966f3cdb0222e3..84b8f90307b0ab11ded8c21fd8e152015c78421a 100644
--- a/force_bdss/kpi/i_kpi_calculator_bundle.py
+++ b/force_bdss/kpi/i_kpi_calculator_bundle.py
@@ -4,6 +4,8 @@ from traits.api import Interface, String
 class IKPICalculatorBundle(Interface):
     id = String()
 
+    name = String()
+
     def create_kpi_calculator(self, application, model):
         pass
 
diff --git a/force_bdss/mco/base_multi_criteria_optimizer_bundle.py b/force_bdss/mco/base_multi_criteria_optimizer_bundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..d44f3877d97bfc9e244a28614ccf14014643308d
--- /dev/null
+++ b/force_bdss/mco/base_multi_criteria_optimizer_bundle.py
@@ -0,0 +1,27 @@
+import abc
+
+from traits.api import ABCHasStrictTraits, String
+from traits.has_traits import provides
+
+from force_bdss.mco.i_multi_criteria_optimizer_bundle import (
+    IMultiCriteriaOptimizerBundle
+)
+
+
+@provides(IMultiCriteriaOptimizerBundle)
+class BaseMultiCriteriaOptimizerBundle(ABCHasStrictTraits):
+    id = String()
+
+    name = String()
+
+    @abc.abstractmethod
+    def create_optimizer(self, application, model):
+        pass
+
+    @abc.abstractmethod
+    def create_model(self, model_data=None):
+        pass
+
+    @abc.abstractmethod
+    def create_communicator(self, model_data):
+        pass
diff --git a/force_bdss/mco/i_multi_criteria_optimizer_bundle.py b/force_bdss/mco/i_multi_criteria_optimizer_bundle.py
index cb4222992cf0d7349a798e9747511c7c7e73b4d6..24557e42c39c27d3913dfb16913d3050b60fb4ab 100644
--- a/force_bdss/mco/i_multi_criteria_optimizer_bundle.py
+++ b/force_bdss/mco/i_multi_criteria_optimizer_bundle.py
@@ -4,6 +4,8 @@ from traits.api import Interface, String
 class IMultiCriteriaOptimizerBundle(Interface):
     id = String()
 
+    name = String()
+
     def create_optimizer(self, application, model):
         pass