diff --git a/addons/web/static/src/js/core/session.js b/addons/web/static/src/js/core/session.js
index 4760867e99ffa7c12375026795043848f6f554ba..11423eec90900127522bbddcb7e15ef727a0f2a8 100644
--- a/addons/web/static/src/js/core/session.js
+++ b/addons/web/static/src/js/core/session.js
@@ -335,7 +335,15 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
 
         delete options.shadow;
 
-        return self.check_session_id().then(function () {
+        var deferred = $.Deferred();
+        var aborted = false;
+        deferred.abort = function () {
+            aborted = true;
+        };
+        self.check_session_id().then(function () {
+            if (aborted) {
+                return deferred.reject('communication', $.Event(), 'abort', 'abort');
+            }
             // TODO: remove
             if (! _.isString(url)) {
                 _.extend(options, url);
@@ -363,10 +371,11 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
                 options.session_id = self.session_id || '';
             }
             var p = fct(url, "call", params, options);
+            deferred.abort = p.abort.bind(p); // Allow to abort the rpc call
             p = p.then(function (result) {
                 if (! shadow)
                     self.trigger('response');
-                return result;
+                return deferred.resolve(result);
             }, function (type, error, textStatus, errorThrown) {
                 if (type === "server") {
                     if (! shadow)
@@ -374,7 +383,7 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
                     if (error.code === 100) {
                         self.uid = false;
                     }
-                    return $.Deferred().reject(error, $.Event());
+                    return deferred.reject(error, $.Event());
                 } else {
                     if (! shadow)
                         self.trigger('response_failed');
@@ -383,17 +392,18 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
                         message: "XmlHttpRequestError " + errorThrown,
                         data: {type: "xhr"+textStatus, debug: error.responseText, objects: [error, errorThrown] }
                     };
-                    return $.Deferred().reject(nerror, $.Event());
+                    return deferred.reject(nerror, $.Event());
                 }
             });
-            return p.fail(function () { // Allow deferred user to disable rpc_error call in fail
-                p.fail(function (error, event) {
+            return deferred.fail(function () { // Allow deferred user to disable rpc_error call in fail
+                deferred.fail(function (error, event) {
                     if (!event.isDefaultPrevented()) {
                         self.trigger('error', error, event);
                     }
                 });
             });
         });
+        return deferred;
     },
     url: function (path, params) {
         params = _.extend(params || {});