diff -ur a/includes/services.runtime.inc b/includes/services.runtime.inc
--- a/includes/services.runtime.inc	2016-09-30 13:22:34.394598988 +0530
+++ b/includes/services.runtime.inc	2016-10-03 15:35:21.197159880 +0530
@@ -110,7 +110,11 @@
     throw $exception;
   }
 
-  _services_controller_execute_restore_user();
+  // Restore user only if callback is not logout.
+  $restore_user = !is_string($controller['callback']) || strpos($controller['callback'], 'logout') === FALSE;
+  if ($restore_user) {
+    _services_controller_execute_restore_user();
+  }
 
   if (!empty($server_info->debug)) {
     watchdog('services', 'results: <pre>@results</pre>', array('@results' => print_r($result, TRUE)), WATCHDOG_DEBUG);
@@ -127,7 +131,7 @@
   global $user;
   services_set_server_info('original_user', $user);
 
-  $preserve_session = !is_string($controller['callback']) || (strpos($controller['callback'], 'login') === FALSE && strpos($controller['callback'], 'logout') === FALSE);
+  $preserve_session = !user_is_anonymous();
   services_set_server_info('preserve_session', $preserve_session);
   if ($preserve_session) {
     $original_session_state = drupal_save_session();
diff -ur a/resources/user_resource.inc b/resources/user_resource.inc
--- a/resources/user_resource.inc	2016-09-30 13:35:43.250591465 +0530
+++ b/resources/user_resource.inc	2016-09-30 13:36:26.658591051 +0530
@@ -659,6 +659,9 @@
 
   watchdog('user', 'Session closed for %name.', array('%name' => $user->name));
 
+  $original_session_state = drupal_save_session();
+  drupal_save_session(TRUE);
+
   // Destroy the current session.
   module_invoke_all('user_logout', $user);
   session_destroy();
@@ -666,6 +669,8 @@
   // Load the anonymous user.
   $user = drupal_anonymous_user();
 
+  drupal_save_session($original_session_state);
+
   return TRUE;
 }
 
