diff --git a/services.module b/services.module
index 5479815..ec75860 100644
--- a/services.module
+++ b/services.module
@@ -367,7 +367,11 @@ function services_services_authentication_info() {
  */
 function _services_sessions_authenticate_call() {
   global $user;
-  $user = services_get_server_info('original_user');
+  $arg = func_get_args();
+  if ($arg[1]['callback'] <> '_user_resource_login') {
+    // The account should be restored to the session's user.
+    $user = services_get_server_info('original_user');
+  }
 }
 
 /**
diff --git a/services.runtime.inc b/services.runtime.inc
index a52c364..d328a51 100644
--- a/services.runtime.inc
+++ b/services.runtime.inc
@@ -101,8 +101,15 @@ function services_controller_execute($controller, $args = array(), $options = ar
   }
 
   $original_user = $user;
-  $old_state = drupal_save_session();
-  drupal_save_session(FALSE);
+  if ($controller['callback'] == '_user_resource_login') {
+    // We do not care about the old session.
+    $old_state = drupal_save_session();
+    drupal_save_session(FALSE);
+  }
+  else {
+    // Do not obliterate the user session if we're not logging in.
+    $old_state = drupal_save_session(FALSE);
+  }
   $user = drupal_anonymous_user();
   $user->timestamp = time();
   services_set_server_info('original_user', $original_user);
@@ -161,10 +168,13 @@ function services_controller_execute($controller, $args = array(), $options = ar
   
   drupal_alter('services_request_postprocess', $controller, $args, $result);
   
-  if (drupal_save_session($user) === FALSE) {
-    $user = $original_user;
-    drupal_save_session($old_state);  
-  }
+  if ($controller['callback'] == '_user_resource_login') {
+    // Obliterate the old user session if we have a new login.
+    drupal_save_session($user);
+   }
+  $user = $original_user;
+  drupal_save_session($old_state);
+
   if ($server_info->debug) {
     watchdog('services', 'results: <pre>@results</pre>', array('@results' => print_r($result, TRUE)), WATCHDOG_DEBUG);
   }
