diff --git a/force_bdss/tests/probe_classes/data_source.py b/force_bdss/tests/probe_classes/data_source.py
new file mode 100644
index 0000000000000000000000000000000000000000..8cc11cb7117f4cdf00adab313b8e4dbf4ea5f8a3
--- /dev/null
+++ b/force_bdss/tests/probe_classes/data_source.py
@@ -0,0 +1,66 @@
+from traits.api import Bool, Function, Str, Int, on_trait_change
+
+from force_bdss.api import (
+    BaseDataSourceFactory, BaseDataSourceModel, BaseDataSource,
+    Slot
+)
+
+from .evaluator_factory import ProbeEvaluatorFactory
+
+
+class ProbeDataSource(BaseDataSource):
+    run_function = Function
+
+    run_called = Bool(False)
+    slots_called = Bool(False)
+
+    def run(self, model, parameters):
+        self.run_called = True
+        self.run_function(model, parameters)
+
+    def slots(self, model):
+        self.slots_called = True
+        return (
+            tuple(Slot(type=model.input_slots_type)
+                  for _ in range(model.input_slots_size))
+        ), (
+            tuple(Slot(type=model.output_slots_type)
+                  for _ in range(model.output_slots_size))
+        )
+
+
+class ProbeDataSourceModel(BaseDataSourceModel):
+    input_slots_type = Str('PRESSURE')
+    output_slots_type = Str('PRESSURE')
+
+    input_slots_size = Int(0)
+    output_slots_size = Int(0)
+
+    @on_trait_change('input_slots_type,output_slots_type,'
+                     'input_slots_size,output_slots_size')
+    def update_slots(self):
+        self.changes_slots = True
+
+
+class ProbeDataSourceFactory(BaseDataSourceFactory,
+                             ProbeEvaluatorFactory):
+    id = Str('enthought.test.data_source')
+    name = Str('test_data_source')
+
+    model_class = ProbeDataSourceModel
+
+    def create_model(self, model_data=None):
+        return self.model_class(
+            factory=self,
+            input_slots_type=self.input_slots_type,
+            output_slots_type=self.output_slots_type,
+            input_slots_size=self.input_slots_size,
+            output_slots_size=self.output_slots_size,
+            **model_data
+        )
+
+    def create_data_source(self):
+        return ProbeDataSource(
+            factory=self,
+            run_function=self.run_function,
+        )
diff --git a/force_bdss/tests/probe_classes/evaluator_factory.py b/force_bdss/tests/probe_classes/evaluator_factory.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9762428123c2661297dc625803186ec5bb7594f
--- /dev/null
+++ b/force_bdss/tests/probe_classes/evaluator_factory.py
@@ -0,0 +1,25 @@
+try:
+    import mock
+except ImportError:
+    from unittest import mock
+
+from envisage.plugin import Plugin
+
+from traits.api import HasStrictTraits, Function, Str, Int
+
+
+class ProbeEvaluatorFactory(HasStrictTraits):
+    def __init__(self, plugin=None, *args, **kwargs):
+        if plugin is None:
+            plugin = mock.Mock(Plugin)
+
+        super(ProbeEvaluatorFactory, self).__init__(
+            plugin=plugin, *args, **kwargs)
+
+    run_function = Function
+
+    input_slots_type = Str('PRESSURE')
+    output_slots_type = Str('PRESSURE')
+
+    input_slots_size = Int(0)
+    output_slots_size = Int(0)
diff --git a/force_bdss/tests/probe_classes/factory_registry_plugin.py b/force_bdss/tests/probe_classes/factory_registry_plugin.py
index 232390508467042aca4f9f3d12749d83a7224466..08b6e0a96c329cb240d2d18cb5a78e58137f29a1 100644
--- a/force_bdss/tests/probe_classes/factory_registry_plugin.py
+++ b/force_bdss/tests/probe_classes/factory_registry_plugin.py
@@ -3,6 +3,7 @@ from traits.api import List
 from force_bdss.factory_registry_plugin import FactoryRegistryPlugin
 
 from .kpi_calculator import ProbeKPICalculatorFactory
+from .data_source import ProbeDataSourceFactory
 
 
 class ProbeFactoryRegistryPlugin(FactoryRegistryPlugin):
@@ -12,4 +13,7 @@ class ProbeFactoryRegistryPlugin(FactoryRegistryPlugin):
     notification_listener_factories = List()
 
     def _kpi_calculator_factories_default(self):
-        return ProbeKPICalculatorFactory(self)
+        return [ProbeKPICalculatorFactory(self)]
+
+    def _data_source_factories_default(self):
+        return [ProbeDataSourceFactory(self)]
diff --git a/force_bdss/tests/probe_classes/kpi_calculator.py b/force_bdss/tests/probe_classes/kpi_calculator.py
index 351ab6cba6bcd3b66ab4ba7a82f2ba5f820eb96f..c3e455597371ca8f8b614cb44fcab5f9eac991aa 100644
--- a/force_bdss/tests/probe_classes/kpi_calculator.py
+++ b/force_bdss/tests/probe_classes/kpi_calculator.py
@@ -1,18 +1,12 @@
-try:
-    import mock
-except ImportError:
-    from unittest import mock
-
-from envisage.plugin import Plugin
-
-from traits.api import (HasStrictTraits, Bool, Function, Str, Int,
-                        on_trait_change)
+from traits.api import Bool, Function, Str, Int, on_trait_change
 
 from force_bdss.api import (
     BaseKPICalculatorFactory, BaseKPICalculatorModel, BaseKPICalculator,
     Slot
 )
 
+from .evaluator_factory import ProbeEvaluatorFactory
+
 
 class ProbeEvaluator(BaseKPICalculator):
     run_function = Function
@@ -35,23 +29,6 @@ class ProbeEvaluator(BaseKPICalculator):
         )
 
 
-class ProbeEvaluatorFactory(HasStrictTraits):
-    def __init__(self, plugin=None, *args, **kwargs):
-        if plugin is None:
-            plugin = mock.Mock(Plugin)
-
-        super(ProbeEvaluatorFactory, self).__init__(
-            plugin=plugin, *args, **kwargs)
-
-    run_function = Function
-
-    input_slots_type = Str('PRESSURE')
-    output_slots_type = Str('PRESSURE')
-
-    input_slots_size = Int(0)
-    output_slots_size = Int(0)
-
-
 class ProbeKPICalculatorModel(BaseKPICalculatorModel):
     input_slots_type = Str('PRESSURE')
     output_slots_type = Str('PRESSURE')