diff --git a/odoo/addons/test_testing_utilities/tests/__init__.py b/odoo/addons/test_testing_utilities/tests/__init__.py
index 78398a30bce98f970a5d0f34b55565773be3299f..2ae17dd13856afe005400a2ee56152ac50e7235d 100644
--- a/odoo/addons/test_testing_utilities/tests/__init__.py
+++ b/odoo/addons/test_testing_utilities/tests/__init__.py
@@ -3,3 +3,4 @@ from . import test_methods
 from . import test_lxml
 from . import test_form_impl
 from . import test_xml_tools
+from . import test_env
diff --git a/odoo/addons/test_testing_utilities/tests/test_env.py b/odoo/addons/test_testing_utilities/tests/test_env.py
new file mode 100644
index 0000000000000000000000000000000000000000..77b6353f9310f5d3823d15eb81e4b3cf2cd6dc9d
--- /dev/null
+++ b/odoo/addons/test_testing_utilities/tests/test_env.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.tests.common import SavepointCase
+
+
+class TestEnv(SavepointCase):
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestEnv, cls).setUpClass()
+        user = cls.env['res.users'].create({
+            'name': 'superuser',
+            'login': 'superuser',
+            'password': 'superuser',
+            'groups_id': [(6, 0, cls.env.user.groups_id.ids)],
+        })
+        cls.env = cls.env(user=user)
+
+        # make sure there is at least another environment in the current transaction
+        cls.sudo_env = cls.env(su=True)
+
+    def test_env_company_part_01(self):
+        """
+        The main goal of the test is actually to check the values of the
+        environment after this test execution (see test_env_company_part_02)
+        """
+        company = self.env['res.company'].create({
+            "name": "Test Company",
+        })
+        self.env.user.write({
+            'company_id': company.id,
+            'company_ids': [(4, company.id), (4, self.env.company.id)],
+        })
+        self.assertEqual(self.env.company, self.env.user.company_id)
+        self.assertTrue(self.env.company.exists())
+        self.assertEqual(self.sudo_env.company, self.env.user.company_id)
+        self.assertTrue(self.sudo_env.company.exists())
+
+    def test_env_company_part_02(self):
+        self.assertEqual(self.env.company, self.env.user.company_id)
+        self.assertTrue(self.env.company.exists())
+        self.assertEqual(self.sudo_env.company, self.env.user.company_id)
+        self.assertTrue(self.sudo_env.company.exists())
diff --git a/odoo/api.py b/odoo/api.py
index 606a06e71374d4d5113836084433fc59058c9974..c95d3daa3e0cab4dfa46bbbc3a5e569c38612255 100644
--- a/odoo/api.py
+++ b/odoo/api.py
@@ -616,6 +616,7 @@ class Environment(Mapping):
         """ Clear all record caches, and discard all fields to recompute.
             This may be useful when recovering from a failed ORM operation.
         """
+        lazy_property.reset_all(self)
         self.cache.invalidate()
         self.all.tocompute.clear()
         self.all.towrite.clear()
diff --git a/odoo/tests/common.py b/odoo/tests/common.py
index 0778c059305da6e9c1f2c149fdf33427db51460e..b39a15617188da2b6037de0a0950ac31bf6f0f03 100644
--- a/odoo/tests/common.py
+++ b/odoo/tests/common.py
@@ -655,11 +655,13 @@ class SavepointCase(SingleTransactionCase):
         # restore environments after the test to avoid invoking flush() with an
         # invalid environment (inexistent user id) from another test
         envs = self.env.all.envs
+        for env in list(envs):
+            self.addCleanup(env.clear)
+        # restore the set of known environments as it was at setUp
         self.addCleanup(envs.update, list(envs))
         self.addCleanup(envs.clear)
 
         self.addCleanup(self.registry.clear_caches)
-        self.addCleanup(self.env.clear)
 
         self._savepoint_id = next(savepoint_seq)
         self.cr.execute('SAVEPOINT test_%d' % self._savepoint_id)