--- og_user_roles.module.orig	2008-10-16 10:19:09.000000000 +0200
+++ og_user_roles.module	2008-10-16 10:18:46.000000000 +0200
@@ -1056,19 +1056,30 @@ function og_user_roles_filter_role() {
  * from here: http://drupal.org/project/globalredirect
  */
 function og_user_roles_init() {
-  global $user;
+  global $user, $og_user_roles_added;
 
   // Let's try getting og roles here, just to see what happens
   // Added here as per hook_init() suggestion: http://api.drupal.org/api/function/hook_init/5
   // Don't call og_user_roles_all_roles unless this user is logged in
-  if ($user->uid > 0) {
-    $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any
-    $user->roles = $roles;
-    if (variable_get('og_user_roles_clear_cache_value', 0) == 1) {
-	  cache_clear_all($user->uid, 'cache_menu', TRUE);
-	  // Clear the user_access $perm cache
-	  user_access('', NULL, TRUE);
-	}
+  if ($user->uid > 0) {   
+    $added_roles = (isset($og_user_roles_added[$user->uid]) && count($og_user_roles_added[$user->uid]) > 0);
+    $no_added_roles = $added_roles == FALSE && isset($_SESSION['og_user_roles_cache']);
+    $different_added_roles = $added_roles == TRUE
+                             && isset($_SESSION['og_user_roles_cache'])
+                             && $_SESSION['og_user_roles_cache'] != $og_user_roles_added[$user->uid];
+                             
+    if ($no_added_roles || $different_added_roles) {
+      unset($_SESSION['og_user_roles_cache']);
+      cache_clear_all($user->uid, 'cache_menu', TRUE);
+    }
+    else if($added_roles == TRUE && variable_get('og_user_roles_clear_cache_value', 0) == 1) {
+      if (!isset($_SESSION['og_user_roles_cache'])) {
+        $_SESSION['og_user_roles_cache'] = $og_user_roles_added[$user->uid];
+        cache_clear_all($user->uid, 'cache_menu', TRUE);
+      }
+      // Clear the user_access $perm cache
+      user_access('', NULL, TRUE);
+    }
   }
 
   // Looking for this format: http://www.scbbs.com/node/add/link?gids[]=29
@@ -1890,6 +1901,12 @@ function og_user_roles_get_groups_result
  * of group and non-group roles for this user.
  */
 function og_user_roles_all_roles($user) {
+  global $og_user_roles_added;
+  
+  if (!isset($og_user_roles_added)) {
+    $og_user_roles_added = array();
+  }
+
   // This will be the process to get BOTH the group and non-group roles for a user
   $uid = $user->uid;
   $gid = 0;
@@ -2408,10 +2425,14 @@ function og_user_roles_all_roles($user) 
  * Makes sure use is "active" (not in moderation) before any of these group roles are added.
  * Was: $query = 'SELECT r.rid, r.name FROM {role} r INNER JOIN {og_users_roles} ogr ON r.rid = ogr.rid WHERE ogr.uid = %d AND ogr.gid = %d';
  */
-
-  $query = 'SELECT r.rid, r.name FROM {role} r INNER JOIN {og_users_roles} ogr ON r.rid = ogr.rid INNER JOIN {og_uid} ogu ON ogu.uid = ogr.uid AND ogu.nid = ogr.gid WHERE ogr.uid = %d AND ogr.gid = %d AND ogu.is_active = 1';
-  $results = db_query($query, $uid, $gid);
 
+  if ($gid > 0) {
+    $query = 'SELECT r.rid, r.name FROM {role} r INNER JOIN {og_users_roles} ogr ON r.rid = ogr.rid INNER JOIN {og_uid} ogu ON ogu.uid = ogr.uid AND ogu.nid = ogr.gid WHERE ogr.uid = %d AND ogr.gid = %d AND ogu.is_active = 1';
+    $results = db_query($query, $uid, $gid);
+  }
+  else {
+    $results = FALSE;
+  }
   //
   // Create an array of these roles;
   //
@@ -2433,6 +2454,13 @@ function og_user_roles_all_roles($user) 
     $d = array();
     $d = $c + $ogroles;
     $d = array_unique($d);
+
+    // We add this to a global so we can always keep track of which roles where added.
+    if (!isset($og_user_roles_added[$user->uid])) {
+      $og_user_roles_added[$user->uid] = array();
+    }
+    $og_user_roles_added[$user->uid] = array_merge($og_user_roles_added[$user->uid], $ogroles);
+    $og_user_roles_added[$user->uid] = array_unique($og_user_roles_added[$user->uid]);
   }
   else {
     $d = $c;
