diff --git a/TODO b/TODO
index 4d59484e5edc28a614ed9a0369175e79cc5209fe..98a58e30f8ed6caff1bc24b91d583638c84b96cf 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,5 @@
-- select for update
-
 Nasazení:
 - zkontrolovat rotování logů (i u /akce/mathletics/ a jiných instancí uwsgi)
+- zapnout mule v uwsgi.ini
+- upgradovat strukturu DB
+- doplnit config.py
diff --git a/etc/uwsgi.ini.example b/etc/uwsgi.ini.example
index c8e1c202a890d64be117cc610cf7745527412d6c..c2559d9d8dc58418bcd62034287d6ae9eacd3eeb 100644
--- a/etc/uwsgi.ini.example
+++ b/etc/uwsgi.ini.example
@@ -18,5 +18,6 @@ mount = /osmo-test=mo.web:app
 plugin = python3
 virtualenv = venv
 manage-script-name = true
+mule
 
 static-map = /static=static
diff --git a/mo/web/__init__.py b/mo/web/__init__.py
index 31b84a900e0d3f7f6555981726960a8a910d97d5..5e52757de362ac0b74f1ee1810bb9ace8e3f4485 100644
--- a/mo/web/__init__.py
+++ b/mo/web/__init__.py
@@ -13,6 +13,7 @@ import werkzeug.exceptions
 import mo
 import mo.config as config
 import mo.db as db
+import mo.jobs
 import mo.users
 import mo.util
 from mo.util import logger
@@ -83,6 +84,39 @@ def init_request():
 app.before_request(init_request)
 
 
+### UWSGI glue ###
+
+try:
+    import uwsgi
+    from uwsgidecorators import timer, signal
+
+    # Čas od času se probudíme a projdeme joby pro případ, že by se ztratil signál.
+    # Také při tom expirujeme zastaralé joby.
+    @timer(120, target='mule')
+    def mule_timer(signum):
+        app.logger.debug('Mule: Timer tick')
+        with app.app_context():
+            mo.now = mo.util.get_now()
+            mo.jobs.process_jobs()
+
+    # Obykle při vložení jobu dostaneme signál.
+    @signal(42, target='mule')
+    def mule_signal(signum):
+        app.logger.debug('Mule: Přijat signál')
+        with app.app_context():
+            mo.now = mo.util.get_now()
+            mo.jobs.process_jobs()
+
+    def wake_up_mule():
+        app.logger.debug('Mule: Posíláme signál')
+        uwsgi.signal(42)
+
+    mo.jobs.send_notify = wake_up_mule
+
+except ImportError:
+    app.logger.warn('Nenalezeno UWSGI, takže automatické notifikace nepoběží.')
+
+
 # Většina webu je v samostatných modulech
 import mo.web.auth
 import mo.web.menu
diff --git a/setup.py b/setup.py
index a7c8f036724d712cbfa5ff5c1402a08c22f8754d..e4d89a8bc5b95204265132509d238371a0c739c9 100644
--- a/setup.py
+++ b/setup.py
@@ -30,5 +30,6 @@ setuptools.setup(
         'pikepdf',
         'psycopg2',
         'sqlalchemy',
+        'uwsgidecorators',
     ],
 )