diff --git a/sudo.module b/sudo.module
index d7de32c..b342972 100755
--- a/sudo.module
+++ b/sudo.module
@@ -60,7 +60,13 @@ function sudo_roles($uid = NULL) {
 }
 
 function sudo_user($op, &$edit, &$account, $category) {
-  if ($op == 'update') {
+  global $user;
+  // If some other user grants the active user on the system through the user-edit page, then
+  // make the change persistent; however, if the update is for the active user, then we ignore
+  // the update. You cannot 'sudo' and then make yourself a permanent admin; also, hook_user is
+  // called when the "sudo" button is used, we certainly do not want to remove those roles from
+  // the sudo table.
+  if (($op == 'update') && ($user->uid != $account->uid)) {
 
     $default_sudo_roles = variable_get('sudo_default_roles', array());
     $save_roles = array_keys($edit['roles']);
diff --git a/sudo.pages.inc b/sudo.pages.inc
index 4fb1ef0..41cd66e 100755
--- a/sudo.pages.inc
+++ b/sudo.pages.inc
@@ -121,7 +121,7 @@ function sudo_settings($form_state) {
  *
  * @ingroup themeable
  */
-function theme_sudo_checkboxes(&$form) {
+function theme_sudo_checkboxes($form) {
 
   $header[] = t('Users');
   foreach ($form['roles']['#value'] as $rid => $role_name) {
@@ -253,14 +253,10 @@ function sudo_multiple_delete_confirm_submit($form, &$form_state) {
 
           // save the user account
           if (is_array($remove_roles) && !empty($remove_roles)) { // sanity check
-            $placeholders = db_placeholders($remove_roles, 'int');
-            array_unshift($remove_roles, $uid);
-            db_query("DELETE FROM {users_roles} WHERE uid = %d AND rid IN ($placeholders)", $remove_roles);
-            foreach ($keep_roles as $rid) {
-              db_query("INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)", $uid, $rid);
-            }
+            $account = user_load($uid);
+            $roles = array_diff_key($account->roles, array_flip($remove_roles));
+            user_save($account, array('roles' => $roles));
           }
-
         }
       }
     }
@@ -284,19 +280,45 @@ function sudo_switch_submit($form, &$form_state) {
   }
   global $user;
   if ($sudo_roles = sudo_roles()) { // intentional assignment of $sudo_roles
-
-    // if user is missing sudo roles, add them
-    $placeholders = db_placeholders($sudo_roles);
-    array_unshift($sudo_roles, $user->uid);
-    db_query("DELETE FROM {users_roles} WHERE uid = %d AND rid IN ($placeholders)", $sudo_roles);
+    $roles = $user->roles;
     if (!$_SESSION['sudoing']) {
-      array_shift($sudo_roles);
-      foreach ($sudo_roles as $rid) {
-        db_query("INSERT INTO {users_roles} VALUES (%d, %d)", $user->uid, $rid);
+      $roles += array_combine($sudo_roles, $sudo_roles);
+      $role_names = _sudo_compose_list_of_roles($sudo_roles);
+      $message = t("You now have access to the @roles on this site.  Click the %title button to return to your normal usage permissions.", array('@roles' => $role_names, '%title' => variable_get('sudo_title_sudoing', 'sudo')));
+    }
+    else {
+      //$role_adjustments = array_combine($sudo_roles, $sudo_roles);
+      $roles = array_diff_key($roles, array_flip($sudo_roles));
+      $message = t("You have resumed using your normal permissions mode on this site.");
+    }
+    if ($roles != $user->roles) {
+      $result_save = user_save($user, array('roles' => $roles));
+      if (!$result_save) {
+        drupal_set_message(t("Failed to save user roles!"));
+      }
+      else {
+        drupal_set_message($message);
       }
     }
+  }
+}
+
+function _sudo_compose_list_of_roles($list_of_rids) {
+  return _sudo_compose_named_list($list_of_rids, array(t("role"), t("roles")), user_roles());
+}
 
+function _sudo_compose_named_list($list_of_keys, $singular_and_plural_forms, $map_of_names) {
+  $noun = (count($list_of_keys) > 1) ? $singular_and_plural_forms[1] : $singular_and_plural_forms[0];
+  $result = "";
+  $separator = t(" and ");
+  foreach ($list_of_keys as $rid) {
+    if (!empty($result)) {
+      $result = $separator . $result;
+      $separator = ', ';
+    }
+    $result = "'$map_of_names[$rid]'" . $result;
   }
+  return $noun . ' ' . $result;
 }
 
 /**
@@ -328,13 +350,9 @@ function sudo_site_offline_submit($form, &$form_state) {
     while ($r = db_fetch_object($q)) {
       $roles = $r->roles ? unserialize($r->roles) : FALSE;
       if (is_array($roles) && count($roles)) {
-        array_unshift($roles, $r->uid);
-        $placeholders = db_placeholders($roles, 'int');
-        db_query("DELETE FROM {users_roles} WHERE uid = %d AND rid IN ($placeholders)", $roles);
-        array_shift($roles);
-        foreach ($roles as $rid) {
-          db_query("INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)", $r->uid, $rid);
-        }
+        $account = user_load($r->uid);
+        $roles = $account->roles + array_combine($sudo_roles, $sudo_roles);
+        user_save($account, array('roles' => $roles));
       }
     }
   }
