diff --git a/addons/hr/__manifest__.py b/addons/hr/__manifest__.py
index 6180b6ddb88..599c49b168a 100644
--- a/addons/hr/__manifest__.py
+++ b/addons/hr/__manifest__.py
@@ -70,6 +70,7 @@
],
'web.assets_tests': [
'hr/static/tests/tours/hr_employee_flow.js',
+ 'hr/static/tests/tours/user_modify_own_profile_tour.js',
],
},
'license': 'LGPL-3',
diff --git a/addons/hr/static/tests/tours/user_modify_own_profile_tour.js b/addons/hr/static/tests/tours/user_modify_own_profile_tour.js
new file mode 100644
index 00000000000..e88659b0a7b
--- /dev/null
+++ b/addons/hr/static/tests/tours/user_modify_own_profile_tour.js
@@ -0,0 +1,19 @@
+/** @odoo-module **/
+
+import tour from 'web_tour.tour';
+
+/**
+ * As 'hr' changes the flow a bit and displays the user preferences form in a full view instead of
+ * a modal, we adapt the steps of the original tour accordingly.
+ */
+tour.tours['mail/static/tests/tours/user_modify_own_profile_tour.js'].steps = [{
+ content: 'Open user account menu',
+ trigger: '.o_user_menu button',
+}, {
+ content: "Open preferences / profile screen",
+ trigger: '[data-menu=settings]',
+}, {
+ content: "Update the email address",
+ trigger: 'div[name="email"] input',
+ run: 'text updatedemail@example.com',
+}, ...tour.stepUtils.saveForm()];
diff --git a/addons/mail/static/tests/tours/user_modify_own_profile_tour.js b/addons/mail/static/tests/tours/user_modify_own_profile_tour.js
new file mode 100644
index 00000000000..3b85bbd04cd
--- /dev/null
+++ b/addons/mail/static/tests/tours/user_modify_own_profile_tour.js
@@ -0,0 +1,26 @@
+/** @odoo-module **/
+
+import tour from 'web_tour.tour';
+
+/**
+ * Verify that a user can modify their own profile information.
+ */
+tour.register('mail/static/tests/tours/user_modify_own_profile_tour.js', {
+ test: true,
+}, [{
+ content: 'Open user account menu',
+ trigger: '.o_user_menu button',
+}, {
+ content: "Open preferences / profile screen",
+ trigger: '[data-menu=settings]',
+}, {
+ content: "Update the email address",
+ trigger: 'div[name="email"] input',
+ run: 'text updatedemail@example.com',
+}, {
+ content: "Save the form",
+ trigger: 'button[name="preference_save"]',
+}, {
+ content: "Wait until the modal is closed",
+ trigger: 'body:not(.modal-open)',
+}]);
diff --git a/addons/mail/tests/__init__.py b/addons/mail/tests/__init__.py
index 4f050f4c3cd..c492546effb 100644
--- a/addons/mail/tests/__init__.py
+++ b/addons/mail/tests/__init__.py
@@ -16,3 +16,4 @@ from . import test_res_users_settings
from . import test_rtc
from . import test_uninstall
from . import test_update_notification
+from . import test_user_modify_own_profile
diff --git a/addons/mail/tests/test_user_modify_own_profile.py b/addons/mail/tests/test_user_modify_own_profile.py
new file mode 100644
index 00000000000..3477cd9bfa5
--- /dev/null
+++ b/addons/mail/tests/test_user_modify_own_profile.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.tests import HttpCase, tagged
+
+
+@tagged('-at_install', 'post_install')
+class TestUserModifyOwnProfile(HttpCase):
+
+ def test_user_modify_own_profile(self):
+ """" A user should be able to modify their own profile.
+ Even if that user does not have access rights to write on the res.users model. """
+
+ self.start_tour("/web", "mail/static/tests/tours/user_modify_own_profile_tour.js", login="demo")
+ self.assertEqual(self.env.ref('base.user_demo').email, "updatedemail@example.com")
diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml
index 6e13d34ad6c..31f3feb34ac 100644
--- a/odoo/addons/base/views/res_users_views.xml
+++ b/odoo/addons/base/views/res_users_views.xml
@@ -449,7 +449,7 @@
res.users
-