diff --git a/etc/config.py.example b/etc/config.py.example
index a93ece2d5805b5bba8c375acd4cd48cb32bfd020..f7db910c8d24c676a30bba7a76e80c983ab6f1db 100644
--- a/etc/config.py.example
+++ b/etc/config.py.example
@@ -42,8 +42,8 @@ MAX_BATCH_CONTENT_LENGTH = 1000000000
 # Adresář, do kterého ukládáme data (pro vývoj relativní, pro instalaci absolutní)
 DATA_DIR = 'data'
 
-# Jak často se má provádět periodická kontrola dávek [s]
-JOB_GC_PERIOD = 60
+# Jak často se má spouštět garbage collector na dávky a tokeny [s]
+GC_PERIOD = 60
 
 # Za jak dlouho expiruje dokončená dávka [min]
 JOB_EXPIRATION = 5
diff --git a/mo/users.py b/mo/users.py
index 8a12debf0592feea0a28d3a139dba88057ee794f..7e0c90b3f0adb40d1e7eae5ad6883a9fa9b891bb 100644
--- a/mo/users.py
+++ b/mo/users.py
@@ -264,3 +264,11 @@ def new_reg_request(type: db.RegReqType, client: str) -> Optional[db.RegRequest]
         email_token=email_token,
         client=client,
     )
+
+
+def expire_reg_requests():
+    sess = db.get_session()
+    conn = sess.connection()
+    table = db.RegRequest.__table__
+    conn.execute(table.delete().where(table.c.expires_at < mo.now))
+    sess.commit()
diff --git a/mo/web/__init__.py b/mo/web/__init__.py
index 0121788742a13b59bd58ebf83ff33f27e7eb9a0e..1be472cfdbdb70c76c8fd7e03e16dc800b1728fe 100644
--- a/mo/web/__init__.py
+++ b/mo/web/__init__.py
@@ -171,18 +171,28 @@ app.before_request(init_request)
 
 ### UWSGI glue ###
 
+# Čas od času se probudíme a spustíme garbage collector:
+#    - projdeme joby pro případ, že by se ztratil signál
+#    - expirujeme zastaralé joby
+#    - expirujeme zastaralé registrační tokeny
+@app.cli.command('gc')
+def gc():
+    """Run garbage collector."""
+
+    mo.now = mo.util.get_now()
+    mo.jobs.process_jobs()
+    mo.users.expire_reg_requests()
+
+
 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(config.JOB_GC_PERIOD, target='mule')
+    @timer(config.GC_PERIOD, 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()
+            garbage_collect()
 
     # Obykle při vložení jobu dostaneme signál.
     @signal(42, target='mule')