diff --git a/mo/__init__.py b/mo/__init__.py
index d29dbadd2c2170bac11d6d6323df5681e7b5cf76..4ee7974be573575ac482398eca1d729a1cfff24f 100644
--- a/mo/__init__.py
+++ b/mo/__init__.py
@@ -1,4 +1,9 @@
 # Top-level module
 
+import datetime
+
 # Aktuální ročník
 current_year = 70
+
+# Referenční čas nastavovaný v initu requestu (web) nebo při volání skriptu
+now: datetime.datetime
diff --git a/mo/web/__init__.py b/mo/web/__init__.py
index 31d637f44bcb8f5631d0b7b01f475b52ab74f1e9..df78cc1ee8f452ce5a3214d7f64435dd7170722a 100644
--- a/mo/web/__init__.py
+++ b/mo/web/__init__.py
@@ -9,6 +9,7 @@ import logging
 import os
 import werkzeug.exceptions
 
+import mo
 import mo.config as config
 import mo.db as db
 import mo.users
@@ -75,6 +76,8 @@ def init_request():
     else:
         user = None
     g.user = user
+    mo.now = datetime.datetime.now(tz=dateutil.tz.UTC)
+    g.now = mo.now  # for templates
     mo.util.current_log_user = user
 
     # K některým podstromům je nutné mít speciální oprávnění
@@ -93,14 +96,6 @@ def init_request():
 app.before_request(init_request)
 
 
-# Kešování aktuálního času
-
-def get_request_time() -> datetime.datetime:
-    if not hasattr(g, 'now'):
-        g.now = datetime.datetime.now(tz=dateutil.tz.UTC)
-    return g.now
-
-
 # Většina webu je v samostatných modulech
 import mo.web.auth
 import mo.web.menu
diff --git a/mo/web/templates/user_contest_task.html b/mo/web/templates/user_contest_task.html
index f648dd4a81af696bbc7501b7e8414fa39c9b0ac4..819f7a11854239e13a8036c561bd57a77a236e0d 100644
--- a/mo/web/templates/user_contest_task.html
+++ b/mo/web/templates/user_contest_task.html
@@ -9,7 +9,7 @@
 
 <h3>Odevzdat řešení</h3>
 
-{% if round.ct_submit_end != None and when > round.ct_submit_end %}
+{% if round.ct_submit_end != None and g.now > round.ct_submit_end %}
 <p class="alert alert-danger">Pozor, odevzdáváte po termínu. Vaše řešení nemusí být hodnoceno.
 Doporučujeme využít políčko pro komentář a vysvětlit situaci.
 {% endif %}
diff --git a/mo/web/user.py b/mo/web/user.py
index 001284d1cc0aa714ad56d211f3d37664b90e38f7..681276c4ff7a63d146019a2f4b3f053c86c11843 100644
--- a/mo/web/user.py
+++ b/mo/web/user.py
@@ -10,12 +10,13 @@ import werkzeug.exceptions
 import wtforms
 import wtforms.validators as validators
 
+import mo
 import mo.config as config
 import mo.db as db
 import mo.submit
 import mo.util
 from mo.util import logger
-from mo.web import app, get_request_time
+from mo.web import app
 import mo.web.util
 
 
@@ -36,7 +37,6 @@ def user_index():
     return render_template(
         'user_index.html',
         pions=pions,
-        when=get_request_time(),
         db=db,  # kvůli hodnotám enumů
     )
 
@@ -83,7 +83,7 @@ def task_statement_available(contest: db.Contest) -> bool:
     return (round.state == db.RoundState.running
             and round.tasks_file is not None
             and round.ct_tasks_start is not None
-            and get_request_time() >= round.ct_tasks_start)
+            and mo.now >= round.ct_tasks_start)
 
 
 @app.route('/user/contest/<int:id>/')
@@ -181,7 +181,6 @@ def user_contest_task(contest_id: int, task_id: int):
         contest=contest,
         task=task,
         papers=papers,
-        when=get_request_time(),
         form=form,
     )