diff --git a/addons/website_mail/controllers/main.py b/addons/website_mail/controllers/main.py
index 5ae3b6a07346a924e63aed22556e1c9485c2095d..1d98899ba4e09dba5fb42a7bf46b0fdd6e53c196 100644
--- a/addons/website_mail/controllers/main.py
+++ b/addons/website_mail/controllers/main.py
@@ -1,10 +1,14 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import urllib
+
 from hashlib import sha1
 from time import time
 from werkzeug.exceptions import NotFound
+from werkzeug import url_encode
 
-from openerp import SUPERUSER_ID
+from openerp import SUPERUSER_ID, _
 from openerp.addons.web import http
 from openerp.addons.web.http import request
 
@@ -65,6 +69,7 @@ def _message_post_helper(res_model='', res_id=None, message='', token='', token_
             res = res.sudo()
         else:
             raise NotFound()
+    kw.pop('force_display', False)
     return res.with_context({'mail_create_nosubscribe': nosubscribe}).message_post(body=message,
                                                                                    message_type=kw.pop('message_type', False) or "comment",
                                                                                    subtype=kw.pop('subtype', False) or "mt_comment",
@@ -147,27 +152,47 @@ class WebsiteMail(http.Controller):
                         ], context=context)) == 1
         return values
 
+    def _generate_login_url(self):
+        url_params = request.params
+        url_params.pop('force_display')
+        url_params.update(redirect=request.httprequest.referrer)
+        redirect_login_url = '/website_mail/post/post' + '?' + url_encode(url_params)
+        url = '/web/login?redirect=%s' % urllib.quote(redirect_login_url)
+        return url
+
     @http.route(['/website_mail/post/json'], type='json', auth='public', website=True)
     def chatter_json(self, res_model='', res_id=None, message='', **kw):
+        # if the chatter is displayed but the user is not logged, redirect him to login page
+        if kw.get('force_display') and not request.session.uid:
+            return {'redirect': self._generate_login_url()}
+        # otherwise, try to post the comment
         res_id = int(res_id)
         try:
-            msg = _message_post_helper(res_model, res_id, message, **kw)
-            data = {
-                'id': msg.id,
-                'body': msg.body,
-                'date': msg.date,
-                'author': msg.author_id.name,
-                'image_url': request.website.image_url(msg.author_id, 'image_small')
-            }
-            return data
+            if message:
+                msg = _message_post_helper(res_model, res_id, message, **kw)
+                data = {
+                    'id': msg.id,
+                    'body': msg.body,
+                    'date': msg.date,
+                    'author': msg.author_id.name,
+                    'image_url': request.website.image_url(msg.author_id, 'image_small')
+                }
+                return data
+            else:
+                return {'error': _('Empty comments are not allowed. Please fill the textearea.')}
         except Exception:
-            return False
+            return {'error': _('Oops! Something went wrong. Try to reload the page and to log in.')}
 
     @http.route(['/website_mail/post/post'], type='http', method=['POST'], auth='public', website=True)
     def chatter_post(self, res_model='', res_id=None, message='', redirect=None, **kw):
-        res_id = int(res_id)
         url = request.httprequest.referrer
-        if message:
-            message = _message_post_helper(res_model, res_id, message, **kw)
-            url = url + "#message-%s" % (message.id,)
+        if kw.get('force_display') and not request.session.uid:
+            # set the redirection param to be redirect here when logged in
+            url = self._generate_login_url()
+        else:
+            res_id = int(res_id)
+            url = redirect or url
+            if message:
+                message = _message_post_helper(res_model, res_id, message, **kw)
+                url = url + "#message-%s" % (message.id,)
         return request.redirect(url)
diff --git a/addons/website_mail/static/src/js/message_post.js b/addons/website_mail/static/src/js/message_post.js
index 3ddb5e2ce908ad3bc19598d7acc228df92575109..8005cb16677c5f84c2e4f3875910da20cd2ab58f 100644
--- a/addons/website_mail/static/src/js/message_post.js
+++ b/addons/website_mail/static/src/js/message_post.js
@@ -38,11 +38,16 @@ odoo.define('website_mail.thread', function(require) {
                 $button.prepend('<i class="fa fa-refresh fa-spin"></i> ');
                 // post message, shw/hide error message and empty textarea
                 ajax.jsonRpc(action, 'call', data).then(function (result) {
-                    if (result) {
-                        $error.fadeOut();
-                        self.prepend_message(result);
-                        $form.find('textarea').val('');
-                    } else {
+                    if (!result['error']) {
+                        if(result['redirect']){
+                            window.location.replace(result['redirect']);
+                        }else{
+                            $error.fadeOut();
+                            self.prepend_message(result);
+                            $form.find('textarea').val('');
+                        }
+                    } else { // display error message from server
+                        $error.html(result['error']);
                         $error.fadeIn();
                     }
                     $button.html(button_bk);
diff --git a/addons/website_mail/views/website_mail.xml b/addons/website_mail/views/website_mail.xml
index 2e246ac18c25051421432379751c967e4abf4de1..e30f8ed57641a05418f9e42246b3c6d469ffaced 100644
--- a/addons/website_mail/views/website_mail.xml
+++ b/addons/website_mail/views/website_mail.xml
@@ -38,10 +38,11 @@
                                  object_shasign function defined in the main controller of website_portal
                 :sha_time string (optional): timestamp of the shasign generation
                 :chatter_mode string: 'json' or 'post' depending on what kind of request you want
+                :force_display : True if the chatter should be display, but posting a message required a logged user. Otherwise, the user will be redirect to the login page.
         -->
         <section id="discussion" class="hidden-print oe_website_portal o_website_mail_thread">
             <section class="mb32 css_editable_mode_hidden hidden-print">
-                <form class="o_website_chatter_form" t-attf-action="/website_mail/post/#{chatter_mode}" method="POST" t-if="website.env.user != request.env['ir.model.data'].xmlid_to_object('base.public_user') or token or sha_in">
+                <form class="o_website_chatter_form" t-attf-action="/website_mail/post/#{chatter_mode}" method="POST" t-if="website.env.user != request.env['ir.model.data'].xmlid_to_object('base.public_user') or token or sha_in or force_display">
                     <img class="img pull-left img-circle" t-attf-src="/web/image/res.partner/#{user_id.partner_id.id}/image_small/50x50" style="width: 50px; margin-right: 10px;"/>
                     <div class="pull-left mb32" style="width: 75%%">
                         <textarea rows="4" name="message" class="form-control" placeholder="Write a message..."></textarea>
@@ -51,6 +52,7 @@
                         <input type='hidden' name="sha_in" t-att-value="sha_in" t-if="sha_in"/>
                         <input type='hidden' name="sha_time" t-att-value="sha_time" t-if="sha_time"/>
                         <input type='hidden' name="token_field" t-att-value="token_field" t-if="token_field"/>
+                        <input type='hidden' name="force_display" t-att-value="force_display" t-if="force_display"/>
                         <div class="alert alert-danger mt8 mb0 o_website_chatter_error" style="display:none;">
                             Oops! Something went wrong. Try to reload the page and to log in.
                         </div>
diff --git a/addons/website_sale/controllers/website_mail.py b/addons/website_sale/controllers/website_mail.py
index 937adbb3d0f357afc13802aa6a3d842e5d3677b6..dd6b0b7757ed3d8a40e09dae0dd664ed71f57c49 100644
--- a/addons/website_sale/controllers/website_mail.py
+++ b/addons/website_sale/controllers/website_mail.py
@@ -15,24 +15,24 @@ class WebsiteMailController(WebsiteMail):
     def chatter_json(self, res_model='', res_id=None, message='', **kw):
         params = kw.copy()
         params.pop('rating', False)
-        message_data = super(WebsiteMailController, self).chatter_json(res_model=res_model, res_id=res_id, message=message, **params)
-        if message_data and kw.get('rating') and res_model == 'product.template':  # restrict rating only for product template
+        result = super(WebsiteMailController, self).chatter_json(res_model=res_model, res_id=res_id, message=message, **params)
+        if result and result.get('id') and kw.get('rating') and res_model == 'product.template':  # restrict rating only for product template
             rating = request.env['rating.rating'].create({
                 'rating': float(kw.get('rating')),
                 'res_model': res_model,
                 'res_id': res_id,
-                'message_id': message_data['id'],
+                'message_id': result['id'],
             })
-            message_data.update({
+            result.update({
                 'rating_default_value': rating.rating,
                 'rating_disabled': True,
             })
-        return message_data
+        return result
 
     @http.route(['/website_mail/post/post'], type='http', method=['POST'], auth='public', website=True)
     def chatter_post(self, res_model='', res_id=None, message='', redirect=None, **kw):
         params = kw.copy()
-        params.pop('rating')
+        params.pop('rating', False)
         response = super(WebsiteMailController, self).chatter_post(res_model=res_model, res_id=res_id, message=message, redirect=redirect, **params)
         if kw.get('rating') and res_model == 'product.template':  # restrict rating only for product template
             try:
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index dfd39c2542a9e695229362afad9ee815c0b29929..bc01e1abc64d61b9d14821943970727f8ddb8dea 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -574,6 +574,7 @@
                   <t t-set="object" t-value="product"/>
                   <t t-set="chatter_mode" t-value="'json'"/>
                   <t t-set="rating_enable" t-value="True"/>
+                  <t t-set="force_display" t-value="True"/>
                 </t>
             </div>
         </section>