diff --git a/og_user_roles.module b/og_user_roles.module
index 6eed2bf..adb60e6 100644
--- a/og_user_roles.module
+++ b/og_user_roles.module
@@ -411,14 +411,18 @@ function og_user_roles_og($op, $nid, $uid, $args = array()) {
     case 'user insert':
       // Add default role for new group members, if configured.
       $node = node_load($nid);
+      $contextual_information = array(
+        'og args' => $args,
+        'og op' => 'user insert',
+      );
       if ($default_role = og_user_roles_get_group_default_role($nid)) {
-        og_user_roles_role_add($nid, $uid, $default_role);
+        og_user_roles_role_add($nid, $uid, $default_role, $contextual_information);
       }
 
       // Add default role for new group admins, if configured.
       if (isset($args['is_admin']) && $args['is_admin']) {
         if (($default_admin_role = variable_get('og_user_roles_default_admin_role_'.$node->type, 0)) && $default_admin_role != $default_role) {
-          og_user_roles_role_add($nid, $uid, $default_admin_role);
+          og_user_roles_role_add($nid, $uid, $default_admin_role, $contextual_information);
         }
       }
       break;
@@ -429,19 +433,27 @@ function og_user_roles_og($op, $nid, $uid, $args = array()) {
       $default_role = og_user_roles_get_group_default_role($nid);
       if ($default_admin_role > 0 && $default_admin_role != $default_role) {
         // Grant role for new group admin.
+        $contextual_information = array(
+          'og args' => $args,
+          'og op' => 'user update',
+        );
         if (isset($args['is_admin']) && $args['is_admin']) {
-          og_user_roles_role_add($nid, $uid, $default_admin_role);
+          og_user_roles_role_add($nid, $uid, $default_admin_role, $contextual_information);
         }
         // Delete role for obsolete group admin.
         else {
-          og_user_roles_role_delete($nid, $uid, $default_admin_role);
+          og_user_roles_role_delete($nid, $uid, $default_admin_role, $contextual_information);
         }
       }
       break;
 
     case 'user delete':
+      $contextual_information = array(
+        'og args' => $args,
+        'og op' => 'user delete',
+      );
       // Remove all group roles for unsubscribed user.
-      og_user_roles_role_delete($nid, $uid);
+      og_user_roles_role_delete($nid, $uid, NULL, $contextual_information);
       break;
   }
 }
@@ -538,11 +550,14 @@ function og_user_roles_get_roles_by_group($gid, $uid) {
  *   The user ID.
  * @param $rid
  *   The role ID to grant.
+ * @param $contextual_information
+ *   Information about where this function is being called and why
  */
-function og_user_roles_role_add($gid, $uid, $rid) {
+function og_user_roles_role_add($gid, $uid, $rid, $contextual_information = array()) {
   $granted = db_result(db_query_range("SELECT rid FROM {og_users_roles} WHERE gid = %d AND uid = %d AND rid = %d", $gid, $uid, $rid, 0, 1));
   if (!$granted) {
     db_query("INSERT INTO {og_users_roles} (uid, gid, rid) VALUES (%d, %d, %d)", $uid, $gid, $rid);
+    module_invoke_all('og_user_roles_role_add', $gid, $uid, $rid, $contextual_information);
   }
 }
 
@@ -555,14 +570,17 @@ function og_user_roles_role_add($gid, $uid, $rid) {
  *   The user ID.
  * @param $rid
  *   (Optional) The role ID to remove. If omitted, all roles are removed.
+ * @param $contextual_information
+ *   Information about where this function is being called and why
  */
-function og_user_roles_role_delete($gid, $uid, $rid = NULL) {
+function og_user_roles_role_delete($gid, $uid, $rid = NULL, $contextual_information = array()) {
   if (is_null($rid)) {
     db_query("DELETE FROM {og_users_roles} WHERE gid = %d AND uid = %d", $gid, $uid);
   }
   else {
     db_query("DELETE FROM {og_users_roles} WHERE gid = %d AND uid = %d AND rid = %d", $gid, $uid, $rid);
   }
+  module_invoke_all('og_user_roles_role_delete', $gid, $uid, $rid, $contextual_information);
 }
 
 /**
