diff --git a/lib/plugins/db/RolePersistence.class.php b/lib/plugins/db/RolePersistence.class.php
index 4ffb2c8bfae347e1c468baa27af47f12bd26ac22..88abce32b5d5dc478dd525f9419446e14e15f175 100644
--- a/lib/plugins/db/RolePersistence.class.php
+++ b/lib/plugins/db/RolePersistence.class.php
@@ -63,10 +63,6 @@ class RolePersistence
      */
     public static function saveRole($role)
     {
-        // sweep roles cache, see #getAllRoles
-        self::expireRolesCache();
-
-        // role is not in database
         $query = "INSERT INTO `roles` (`roleid`, `rolename`, `system`)
                   VALUES (?, ?, 'n')
                   ON DUPLICATE KEY UPDATE `rolename` = VALUES(`rolename`)";
@@ -82,6 +78,9 @@ class RolePersistence
             $event = 'RoleDidUpdate';
         }
 
+        // sweep roles cache, see #getAllRoles
+        self::expireRolesCache();
+
         NotificationCenter::postNotification(
             $event,
             $role->getRoleid(),
@@ -101,18 +100,11 @@ class RolePersistence
         $id = $role->getRoleid();
         $name = $role->getRolename();
 
-        // sweep roles cache
-        self::expireRolesCache();
-
         $query = "SELECT `pluginid` FROM `roles_plugins` WHERE `roleid` = ?";
         $statement = DBManager::get()->prepare($query);
         $statement->execute([$id]);
         $statement->setFetchMode(PDO::FETCH_COLUMN, 0);
 
-        foreach ($statement as $plugin_id) {
-            unset(self::getPluginRolesCache()[$plugin_id]);
-        }
-
         DBManager::get()->execute(
             "DELETE `roles`, `roles_user`, `roles_plugins`, `roles_studipperms`
              FROM `roles`
@@ -123,6 +115,13 @@ class RolePersistence
             [$id]
         );
 
+        // sweep roles cache
+        self::expireRolesCache();
+
+        foreach ($statement as $plugin_id) {
+            unset(self::getPluginRolesCache()[$plugin_id]);
+        }
+
         NotificationCenter::postNotification('RoleDidDelete', $id, $name);
     }
 
@@ -322,8 +321,6 @@ class RolePersistence
     {
         $plugin_id = (int) $plugin_id;
 
-        unset(self::getPluginRolesCache()[$plugin_id]);
-
         $query = "REPLACE INTO `roles_plugins` (`roleid`, `pluginid`)
                   VALUES (:role_id, :plugin_id)";
         $statement = DBManager::get()->prepare($query);
@@ -332,13 +329,16 @@ class RolePersistence
         foreach ($role_ids as $role_id) {
             $statement->bindValue(':role_id', $role_id);
             $statement->execute();
+        }
+
+        unset(self::getPluginRolesCache()[$plugin_id]);
 
+        foreach ($role_ids as $role_id) {
             NotificationCenter::postNotification(
                 'PluginRoleAssignmentDidCreate',
                 $role_id,
                 $plugin_id
             );
-
         }
     }
 
@@ -352,8 +352,6 @@ class RolePersistence
     {
         $plugin_id = (int) $plugin_id;
 
-        unset(self::getPluginRolesCache()[$plugin_id]);
-
         $query = "DELETE FROM `roles_plugins`
                   WHERE `pluginid` = :plugin_id
                     AND `roleid` = :role_id";
@@ -363,13 +361,16 @@ class RolePersistence
         foreach ($role_ids as $role_id) {
             $statement->bindValue(':role_id', $role_id);
             $statement->execute();
+        }
 
+        unset(self::getPluginRolesCache()[$plugin_id]);
+
+        foreach ($role_ids as $role_id) {
             NotificationCenter::postNotification(
                 'PluginRoleAssignmentDidDelete',
                 $role_id,
                 $plugin_id
             );
-
         }
     }