diff --git a/lib/plugins/db/RolePersistence.class.php b/lib/plugins/db/RolePersistence.class.php
index ff17a94d0bd3b2f5779a8638fdc06df81dcce480..bc8490b4cee6a2cc37b3ff0f72923749801f13f7 100644
--- a/lib/plugins/db/RolePersistence.class.php
+++ b/lib/plugins/db/RolePersistence.class.php
@@ -17,6 +17,8 @@ class RolePersistence
     const USER_ROLES_CACHE_KEY = 'roles/user';
     const PLUGIN_ROLES_CACHE_KEY = 'roles/plugin';
 
+    protected static $all_roles = null;
+
     /**
      * Returns all available roles.
      *
@@ -24,32 +26,34 @@ class RolePersistence
      */
     public static function getAllRoles(bool $grouped = false): array
     {
-        // read cache
-        $cache = StudipCacheFactory::getCache();
-
-        // cache miss, retrieve from database
-        $roles = $cache->read(self::ROLES_CACHE_KEY);
-        if (!$roles) {
-            $query = "SELECT `roleid`, `rolename`, `system` = 'y' AS `is_system`
+        if (self::$all_roles === null) {
+            // read cache
+            $cache = StudipCacheFactory::getCache();
+
+            // cache miss, retrieve from database
+            self::$all_roles = $cache->read(self::ROLES_CACHE_KEY);
+            if (!self::$all_roles) {
+                $query = "SELECT `roleid`, `rolename`, `system` = 'y' AS `is_system`
                       FROM `roles`
                       ORDER BY `rolename`";
-            $statement = DBManager::get()->query($query);
-            $statement->setFetchMode(PDO::FETCH_ASSOC);
+                $statement = DBManager::get()->query($query);
+                $statement->setFetchMode(PDO::FETCH_ASSOC);
 
-            $roles = [];
-            foreach ($statement as $row) {
-                $roles[$row['roleid']] = new Role($row['roleid'], $row['rolename'], $row['is_system']);
-            }
+                self::$all_roles = [];
+                foreach ($statement as $row) {
+                    self::$all_roles[$row['roleid']] = new Role($row['roleid'], $row['rolename'], $row['is_system']);
+                }
 
-            $cache->write(self::ROLES_CACHE_KEY, $roles);
+                $cache->write(self::ROLES_CACHE_KEY, self::$all_roles);
+            }
         }
 
         if (!$grouped) {
-            return $roles;
+            return self::$all_roles;
         }
 
         $groups = ['system' => [], 'other' => []];
-        foreach ($roles as $id => $role) {
+        foreach (self::$all_roles as $id => $role) {
             $index = $role->getSystemtype() ? 'system' : 'other';
             $groups[$index][$id] = $role;
         }
@@ -510,6 +514,7 @@ class RolePersistence
      */
     public static function expireRolesCache()
     {
+        self::$all_roles = null;
         StudipCacheFactory::getCache()->expire(self::ROLES_CACHE_KEY);
     }