user_save does not save data
This did the trick.

function xyz_user_presave(&amp;$edit, $account, $category) {
  if (!empty($edit['mail']) &amp;&amp; (!empty($account-&gt;mail) &amp;&amp; $account-&gt;mail != $edit['mail']) &amp;&amp; !user_access('administer users') &amp;&amp; !drupal_installation_attempted()) {
    $role_position = array_search('xyz', $account-&gt;roles);
    // Use !== or === here since $role_position may be zero or FALSE
    if ($role_position !== FALSE) {
      unset($account-&gt;roles[$role_position]);
      $edit['roles'] = $account-&gt;roles;
    }
  }
}


I still do not know what's wrong with the code in the initial post, but whatever...