diff --git a/docs/index.rst b/docs/index.rst
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -144,6 +144,21 @@
     Keyword args:
 
 
+
+Writing a new worker for a new swh-task-type
+--------------------------------------------
+
+When you want to add a new swh-task-type, you need a celery worker backend
+capable of executing this new task-type instances.
+
+Celery workers for swh-scheduler based tasks should be started using the Celery
+app in `swh.scheduler.celery_config`. This later, among other things, provides
+a loading mechanism for task types based on pkg_resources declared plugins under
+the `[swh.workers]` entry point.
+
+TODO: add a fully working example of a dumb task.
+
+
 Reference Documentation
 -----------------------
 
diff --git a/swh/scheduler/celery_backend/config.py b/swh/scheduler/celery_backend/config.py
--- a/swh/scheduler/celery_backend/config.py
+++ b/swh/scheduler/celery_backend/config.py
@@ -5,6 +5,7 @@
 
 import logging
 import os
+import pkg_resources
 import urllib.parse
 
 from celery import Celery
@@ -197,6 +198,18 @@
     # Load the Celery config
     CONFIG = load_named_config(CONFIG_NAME, DEFAULT_CONFIG)
 
+CONFIG.setdefault('task_modules', [])
+# load tasks modules declared as plugin entry points
+for entrypoint in pkg_resources.iter_entry_points('swh.workers'):
+    worker_registrer_fn = entrypoint.load()
+    # The registry function is expected to return a dict which the 'tasks' key
+    # is a string (or a list of strings) with the name of the python module in
+    # which celery tasks are defined.
+    tasks = worker_registrer_fn().get('tasks', [])
+    if isinstance(tasks, str):
+        tasks = [tasks]
+    CONFIG['task_modules'].extend(tasks)
+
 # Celery Queues
 CELERY_QUEUES = [Queue('celery', Exchange('celery'), routing_key='celery')]
 
diff --git a/swh/scheduler/tests/conftest.py b/swh/scheduler/tests/conftest.py
--- a/swh/scheduler/tests/conftest.py
+++ b/swh/scheduler/tests/conftest.py
@@ -34,9 +34,13 @@
 
 @pytest.fixture(scope='session')
 def celery_includes():
-    return [
+    task_modules = [
         'swh.scheduler.tests.tasks',
     ]
+    import pkg_resources
+    for entrypoint in pkg_resources.iter_entry_points('swh.workers'):
+        task_modules.append(entrypoint.load()()['tasks'])
+    return task_modules
 
 
 @pytest.fixture(scope='session')