diff --git a/addons/mail/static/src/js/models/threads/channel.js b/addons/mail/static/src/js/models/threads/channel.js
index 266f5e3db6b4b7dc97d94fea0ef68435f8aa0f71..315e30efdb2f83ee7bd12ac71d7bc1aea3b84a87 100644
--- a/addons/mail/static/src/js/models/threads/channel.js
+++ b/addons/mail/static/src/js/models/threads/channel.js
@@ -5,6 +5,7 @@ var SearchableThread = require('mail.model.SearchableThread');
 var ThreadTypingMixin = require('mail.model.ThreadTypingMixin');
 var mailUtils = require('mail.utils');
 
+const config = require('web.config');
 var session = require('web.session');
 var time = require('web.time');
 
@@ -106,11 +107,15 @@ var Channel = SearchableThread.extend(ThreadTypingMixin, {
      */
     close: function () {
         this._super.apply(this, arguments);
-        this._rpc({
-                model: 'mail.channel',
-                method: 'channel_fold',
-                kwargs: { uuid: this.getUUID(), state: 'closed' },
-            }, { shadow: true });
+        // Do not notify the server to avoid desktop chat window from closing
+        // when a chat window is closed on mobile.
+        if (!config.device.isMobile) {
+            this._rpc({
+                    model: 'mail.channel',
+                    method: 'channel_fold',
+                    kwargs: { uuid: this.getUUID(), state: 'closed' },
+                }, { shadow: true });
+        }
     },
     /**
      * Decrement the needaction counter of the channel
@@ -131,13 +136,17 @@ var Channel = SearchableThread.extend(ThreadTypingMixin, {
     detach: function () {
         var self = this;
         return this._super.apply(this, arguments).then(function () {
-            self._rpc({
-                model: 'mail.channel',
-                method: 'channel_minimize',
-                args: [self.getUUID(), true],
-            }, {
-                shadow: true,
-            });
+            // Do not notify the server to avoid desktop chat window from opening
+            // when a chat window is opened on mobile.
+            if (!config.device.isMobile) {
+                self._rpc({
+                    model: 'mail.channel',
+                    method: 'channel_minimize',
+                    args: [self.getUUID(), true],
+                }, {
+                    shadow: true,
+                });
+            }
         });
     },
     /**
diff --git a/addons/mail/static/src/js/services/mail_manager.js b/addons/mail/static/src/js/services/mail_manager.js
index 83e9d68bc093950b1b1debb2da034a7079f82f9f..0837e983373e57d8bcfe8a41a791dc6d27b01bc5 100644
--- a/addons/mail/static/src/js/services/mail_manager.js
+++ b/addons/mail/static/src/js/services/mail_manager.js
@@ -890,6 +890,11 @@ var MailManager =  AbstractService.extend({
                 args: [[channelID]],
             })
             .then(function (result) {
+                // Prevent to automatically open chat window when a new message
+                // is received on mobile.
+                if (config.device.isMobile) {
+                    options.silent = true;
+                }
                 return self._addChannel(result, options);
             });
     },
@@ -1215,9 +1220,16 @@ var MailManager =  AbstractService.extend({
     _updateChannelsFromServer: function (data) {
         var self = this;
         var proms = [];
+        const options = {};
+
+        // Prevent to automatically open all chat windows at initial loading.
+        if (config.device.isMobile) {
+            options.silent = true;
+        }
+
         _.each(data.channel_slots, function (channels) {
             _.each(channels, function (channel) {
-                proms.push(self._addChannel(channel));
+                proms.push(self._addChannel(channel, options));
             });
         });
         return Promise.all(proms);
diff --git a/addons/mail/static/src/js/services/mail_notification_manager.js b/addons/mail/static/src/js/services/mail_notification_manager.js
index f3c6fdfb26c7e7dd97ab996c3345604b6faf9ced..9cef97427473d89317f6740eb0c308da488276b2 100644
--- a/addons/mail/static/src/js/services/mail_notification_manager.js
+++ b/addons/mail/static/src/js/services/mail_notification_manager.js
@@ -10,6 +10,7 @@ odoo.define('mail.Manager.Notification', function (require) {
 var MailManager = require('mail.Manager');
 var MailFailure = require('mail.model.MailFailure');
 
+const config = require('web.config');
 var core = require('web.core');
 var session = require('web.session');
 
@@ -248,12 +249,15 @@ MailManager.include({
                     _t("You have been invited to: ") + channelData.name);
             }
         }
-        var channel = this.getChannel(channelData.id);
-        if (channel && channelData.info !== 'join') {
-            channel.updateWindowState({
-                folded: channelData.state === 'folded' ? true : false,
-                detached: channelData.is_minimized,
-            });
+        // Prevent to open/close a channel on mobile when you open/close it on desktop.
+        if (!config.device.isMobile) {
+            const channel = this.getChannel(channelData.id);
+            if (channel && channelData.info !== 'join') {
+                channel.updateWindowState({
+                    folded: channelData.state === 'folded' ? true : false,
+                    detached: channelData.is_minimized,
+                });
+            }
         }
     },
     /**
diff --git a/addons/mail/static/src/js/services/mail_window_manager.js b/addons/mail/static/src/js/services/mail_window_manager.js
index d8174da5a73d9b9083f507c9e2f794c715272e38..57b7623e05ae1e938e93bdbf2d77271442e616d4 100644
--- a/addons/mail/static/src/js/services/mail_window_manager.js
+++ b/addons/mail/static/src/js/services/mail_window_manager.js
@@ -435,13 +435,15 @@ MailManager.include({
      * @param {integer} partnerID
      * @returns {Promise<integer>} resolved with ID of the DM chat
      */
-    _openAndDetachDMChat: function (partnerID) {
-        return this._rpc({
+    _openAndDetachDMChat: async function (partnerID) {
+        const data = await this._rpc({
             model: 'mail.channel',
-            method: 'channel_get_and_minimize',
+            method: config.device.isMobile ? 'channel_get' : 'channel_get_and_minimize',
             args: [[partnerID]],
-        })
-        .then(this._addChannel.bind(this));
+        });
+        const channelID = await this._addChannel(data);
+        const channel = this.getChannel(channelID);
+        channel.detach();
     },
     /**
      * On opening a new thread window, place it with other thread windows: