diff --git a/modules/user/user.module b/modules/user/user.module
index 5124207..80bee12 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -588,12 +588,15 @@ function user_save($account, $edit = array(), $category = 'account') {
       $edit = (array) $account;
       user_module_invoke('insert', $edit, $account, $category);
       module_invoke_all('entity_insert', $account, 'user');
+      
+      // Get roles that may already be saved to database during hook calls.
+      $roles_db = db_query('SELECT rid FROM {users_roles} WHERE uid = :uid', array(':uid' => $account->uid))->fetchCol('rid');
 
       // Save user roles.
       if (count($account->roles) > 1) {
         $query = db_insert('users_roles')->fields(array('uid', 'rid'));
         foreach (array_keys($account->roles) as $rid) {
-          if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
+          if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID)) && !in_array($rid, $roles_db)) {
             $query->values(array(
               'uid' => $account->uid,
               'rid' => $rid,
