diff --git a/mo/db.py b/mo/db.py
index 1b3e5ff9fe2c8d728718de6f5b3e7f7ae40fbf06..c52547d23b428018d8a8657ca1bc804a0371de97 100644
--- a/mo/db.py
+++ b/mo/db.py
@@ -136,7 +136,8 @@ class Place(Base):
         return place_levels[self.level].in_name() + " " + name
 
 
-def get_root_place():
+def get_root_place() -> Place:
+    """Obvykle voláme mo.rights.Gatekeeper.get_root_place(), kterékešuje."""
     return get_session().query(Place).filter_by(parent=None).one()
 
 
diff --git a/mo/rights.py b/mo/rights.py
index b0e8878a0244ec1f2db399956c074892a8e025fc..1c8fdfa80d3216fd2779c7cf9d655866e0548071 100644
--- a/mo/rights.py
+++ b/mo/rights.py
@@ -358,6 +358,7 @@ class Gatekeeper:
     roles: List[db.UserRole]
     parent_cache: Dict[int, List[db.Place]]
     rights_cache: Dict[Tuple[Optional[int], Optional[int], Optional[str], Optional[int], Optional[db.RoleType]], Rights]
+    root_place: Optional[db.Place]
 
     def __init__(self, user: db.User):
         self.user = user
@@ -365,6 +366,12 @@ class Gatekeeper:
         assert user.is_org or user.is_admin
         self.parent_cache = {}
         self.rights_cache = {}
+        self.root_place = None
+
+    def get_root_place(self) -> db.Place:
+        if not self.root_place:
+            self.root_place = db.get_root_place()
+        return self.root_place
 
     def get_ancestors(self, place: db.Place) -> List[db.Place]:
         pid = place.place_id
@@ -425,7 +432,7 @@ class Gatekeeper:
         elif for_place:
             place = for_place
         else:
-            place = db.get_root_place()
+            place = self.get_root_place()
         rights = RoundRights()
         rights.round = round
         rights._clone_from(self.rights_for(