diff --git modules/user/user.module modules/user/user.module
index d464a7a..2e531d6 100644
--- modules/user/user.module
+++ modules/user/user.module
@@ -440,18 +440,15 @@ function user_save($account, $edit = array(), $category = 'account') {
     user_module_invoke('presave', $edit, $account, $category);
 
     // Invoke presave operations of Field Attach API and Entity API. Those APIs
-    // require a fully-fledged (and updated) entity object, so $edit is not
-    // necessarily sufficient, as it technically contains submitted form values
-    // only. Therefore, we need to clone $account into a new object and copy any
-    // new property values of $edit into it.
-    $account_updated = clone $account;
+    // require a fully-fledged and updated entity object. Therefore, we need to
+    // copy any new property values of $edit into it.
     foreach ($edit as $key => $value) {
-      $account_updated->$key = $value;
+      $account->$key = $value;
     }
-    field_attach_presave('user', $account_updated);
-    module_invoke_all('entity_presave', $account_updated, 'user');
+    field_attach_presave('user', $account);
+    module_invoke_all('entity_presave', $account, 'user');
     // Update $edit with any changes modules might have applied to the account.
-    foreach ($account_updated as $key => $value) {
+    foreach ($account as $key => $value) {
       if (!property_exists($account, $key) || $value !== $account->$key) {
         $edit[$key] = $value;
       }
@@ -482,12 +479,14 @@ function user_save($account, $edit = array(), $category = 'account') {
       }
 
       // Delete the previous picture if it was deleted or replaced.
-      if ($delete_previous_picture && !empty($account->picture->fid)) {
-        file_usage_delete($account->picture, 'user', 'user', $account->uid);
-        file_delete($account->picture);
+      if ($delete_previous_picture && !empty($account->original->picture->fid)) {
+        file_usage_delete($account->original->picture, 'user', 'user', $account->uid);
+        file_delete($account->original->picture);
       }
 
       $edit['picture'] = empty($edit['picture']->fid) ? 0 : $edit['picture']->fid;
+      // Make sure $account reflects any changes.
+      $account->picture = $edit['picture'];
 
       // Do not allow 'uid' to be changed.
       $edit['uid'] = $account->uid;
@@ -532,26 +531,17 @@ function user_save($account, $edit = array(), $category = 'account') {
       }
 
       // Save Field data.
-      $entity = (object) $edit;
-      field_attach_update('user', $entity);
-
-      // Refresh user object.
-      $user = user_load($account->uid, TRUE);
-      // Make the original, unchanged user account available to update hooks.
-      if (isset($account->original)) {
-        $user->original = $account->original;
-      }
+      field_attach_update('user', $account);
 
       // Send emails after we have the new user object.
-      if (isset($edit['status']) && $edit['status'] != $account->status) {
+      if (isset($edit['status']) && $edit['status'] != $account->original->status) {
         // The user's status is changing; conditionally send notification email.
         $op = $edit['status'] == 1 ? 'status_activated' : 'status_blocked';
-        _user_mail_notify($op, $user);
+        _user_mail_notify($op, $account);
       }
 
-      user_module_invoke('update', $edit, $user, $category);
-      module_invoke_all('entity_update', $user, 'user');
-      unset($user->original);
+      user_module_invoke('update', $edit, $account, $category);
+      module_invoke_all('entity_update', $account, 'user');
     }
     else {
       // Allow 'uid' to be set by the caller. There is no danger of writing an
@@ -571,14 +561,16 @@ function user_save($account, $edit = array(), $category = 'account') {
         return FALSE;
       }
 
-      // Build a stub user object.
-      $user = (object) $edit;
-      $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
-
-      field_attach_insert('user', $user);
+      // Make sure $account reflects any changes applied to $edit and is
+      // properly initialized.
+      foreach ($edit as $key => $value) {
+        $account->$key = $value;
+      }
+      $account->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
 
-      user_module_invoke('insert', $edit, $user, $category);
-      module_invoke_all('entity_insert', $user, 'user');
+      field_attach_insert('user', $account);
+      user_module_invoke('insert', $edit, $account, $category);
+      module_invoke_all('entity_insert', $account, 'user');
 
       // Save user roles.
       if (isset($edit['roles']) && is_array($edit['roles'])) {
@@ -594,8 +586,13 @@ function user_save($account, $edit = array(), $category = 'account') {
         $query->execute();
       }
     }
+    // Clear internal properties.
+    unset($account->is_new);
+    unset($account->original);
+    // Clear the static loading cache.
+    entity_get_controller('user')->resetCache(array($account->uid));
 
-    return $user;
+    return $account;
   }
   catch (Exception $e) {
     $transaction->rollback();
