diff --git a/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java b/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java
index 2a48ec6982d7e8ed39a1d4926ad8f6267da92809..58d791c3df871ed922487a84ddd10c6297ce4f4a 100644
--- a/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java
+++ b/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java
@@ -91,6 +91,24 @@ public class ScimEventListenerProvider implements EventListenerProvider {
                 dispatcher.run((client) -> client.replace(UserAdapter.class, user));
             }
         }
+        if (event.getResourceType() == ResourceType.REALM_ROLE_MAPPING) {
+            Pattern pattern = Pattern.compile("^(.+)/(.+)/role-mappings");
+            Matcher matcher = pattern.matcher(event.getResourcePath());
+            if (matcher.find()) {
+                var type = matcher.group(1);
+                var id = matcher.group(2);
+                LOGGER.infof("%s %s %s roles", event.getOperationType(), type, id);
+                if (type.equals("users")) {
+                    var user = getUser(id);
+                    dispatcher.run((client) -> client.replace(UserAdapter.class, user));
+                } else if (type.equals("groups")) {
+                    var group = getGroup(id);
+                    session.users().getGroupMembersStream(session.getContext().getRealm(), group).forEach(user -> {
+                        dispatcher.run((client) -> client.replace(UserAdapter.class, user));
+                    });
+                }
+            }
+        }
     }
 
     private UserModel getUser(String id) {