diff --git a/addons/mail/models/res_users.py b/addons/mail/models/res_users.py
index 1a34912a7a1b420cf51cd8ffead821f4100b72af..0a250f5964646fb7f95b20048a93d2a707c66a17 100644
--- a/addons/mail/models/res_users.py
+++ b/addons/mail/models/res_users.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
+from collections import defaultdict
+
 from odoo import _, api, exceptions, fields, models, modules
 from odoo.addons.base.models.res_users import is_selection_groups
 
@@ -149,43 +151,41 @@ class Users(models.Model):
 
     @api.model
     def systray_get_activities(self):
-        query = """SELECT m.id, count(*), act.res_model as model,
-                        CASE
-                            WHEN %(today)s::date - act.date_deadline::date = 0 Then 'today'
-                            WHEN %(today)s::date - act.date_deadline::date > 0 Then 'overdue'
-                            WHEN %(today)s::date - act.date_deadline::date < 0 Then 'planned'
-                        END AS states
-                    FROM mail_activity AS act
-                    JOIN ir_model AS m ON act.res_model_id = m.id
-                    WHERE user_id = %(user_id)s
-                    GROUP BY m.id, states, act.res_model;
-                    """
-        self.env.cr.execute(query, {
-            'today': fields.Date.context_today(self),
-            'user_id': self.env.uid,
-        })
-        activity_data = self.env.cr.dictfetchall()
-        model_ids = [a['id'] for a in activity_data]
-        model_names = {n[0]: n[1] for n in self.env['ir.model'].sudo().browse(model_ids).name_get()}
-
+        activities = self.env["mail.activity"].search([("user_id", "=", self.env.uid)])
+        activities_by_record_by_model_name = defaultdict(lambda: defaultdict(lambda: self.env["mail.activity"]))
+        for activity in activities:
+            record = self.env[activity.res_model].browse(activity.res_id)
+            activities_by_record_by_model_name[activity.res_model][record] += activity
+        model_ids = list({self.env["ir.model"]._get(name).id for name in activities_by_record_by_model_name.keys()})
         user_activities = {}
-        for activity in activity_data:
-            if not user_activities.get(activity['model']):
-                module = self.env[activity['model']]._original_module
-                icon = module and modules.module.get_module_icon(module)
-                user_activities[activity['model']] = {
-                    'name': model_names[activity['id']],
-                    'model': activity['model'],
-                    'type': 'activity',
-                    'icon': icon,
-                    'total_count': 0, 'today_count': 0, 'overdue_count': 0, 'planned_count': 0,
-                }
-            user_activities[activity['model']]['%s_count' % activity['states']] += activity['count']
-            if activity['states'] in ('today', 'overdue'):
-                user_activities[activity['model']]['total_count'] += activity['count']
-
-            user_activities[activity['model']]['actions'] = [{
-                'icon': 'fa-clock-o',
-                'name': 'Summary',
-            }]
+        for model_name, activities_by_record in activities_by_record_by_model_name.items():
+            domain = [("id", "in", list({r.id for r in activities_by_record.keys()}))]
+            allowed_records = self.env[model_name].search(domain)
+            if not allowed_records:
+                continue
+            module = self.env[model_name]._original_module
+            icon = module and modules.module.get_module_icon(module)
+            user_activities[model_name] = {
+                "name": self.env["ir.model"]._get(model_name).with_prefetch(model_ids).name,
+                "model": model_name,
+                "type": "activity",
+                "icon": icon,
+                "total_count": 0,
+                "today_count": 0,
+                "overdue_count": 0,
+                "planned_count": 0,
+                "actions": [
+                    {
+                        "icon": "fa-clock-o",
+                        "name": "Summary",
+                    }
+                ],
+            }
+            for record, activities in activities_by_record.items():
+                if record not in allowed_records:
+                    continue
+                for activity in activities:
+                    user_activities[model_name]["%s_count" % activity.state] += 1
+                    if activity.state in ("today", "overdue"):
+                        user_activities[model_name]["total_count"] += 1
         return list(user_activities.values())
diff --git a/addons/test_mail/models/test_mail_corner_case_models.py b/addons/test_mail/models/test_mail_corner_case_models.py
index aa23eca63655e384d15aeeeb956718986566de77..f0eabdd89b4c93a240e36d37632f2c89eb57af14 100644
--- a/addons/test_mail/models/test_mail_corner_case_models.py
+++ b/addons/test_mail/models/test_mail_corner_case_models.py
@@ -86,6 +86,15 @@ class MailTestTrackMonetary(models.Model):
     company_currency = fields.Many2one("res.currency", string='Currency', related='company_id.currency_id', readonly=True, tracking=True)
     revenue = fields.Monetary('Revenue', currency_field='company_currency', tracking=True)
 
+class MailTestMultiCompanyWithActivity(models.Model):
+    """ This model can be used in multi company tests with activity"""
+    _name = "mail.test.multi.company.with.activity"
+    _description = "Test Multi Company Mail With Activity"
+    _inherit = ["mail.thread", "mail.activity.mixin"]
+
+    name = fields.Char()
+    company_id = fields.Many2one("res.company")
+
 
 class MailTestSelectionTracking(models.Model):
     """ Test tracking for selection fields """
diff --git a/addons/test_mail/security/ir.model.access.csv b/addons/test_mail/security/ir.model.access.csv
index 126fc14e151c8291ea698a9749fe3e707c034a5b..923d242245b0f3325f7926a1d2275138bce67d4c 100644
--- a/addons/test_mail/security/ir.model.access.csv
+++ b/addons/test_mail/security/ir.model.access.csv
@@ -25,6 +25,8 @@ access_mail_test_lang_portal,mail.test.lang.portal,model_mail_test_lang,base.gro
 access_mail_test_lang_user,mail.test.lang.user,model_mail_test_lang,base.group_user,1,1,1,1
 access_mail_test_multi_company_user,mail.test.multi.company.user,model_mail_test_multi_company,base.group_user,1,1,1,1
 access_mail_test_multi_company_portal,mail.test.multi.company.portal,model_mail_test_multi_company,base.group_portal,1,0,0,0
+access_mail_test_multi_company_with_activity_user,mail.test.multi.company.with.activity.user,model_mail_test_multi_company_with_activity,base.group_user,1,1,1,1
+access_mail_test_multi_company_with_activity_portal,mail.test.multi.company.with.activity.portal,model_mail_test_multi_company_with_activity,base.group_portal,1,0,0,0
 access_mail_test_track_compute,mail.test.track.compute,model_mail_test_track_compute,base.group_user,1,1,1,1
 access_mail_test_track_monetary,mail.test.track.monetary,model_mail_test_track_monetary,base.group_user,1,1,1,1
 access_mail_test_track_selection_portal,mail.test.track.selection.portal,model_mail_test_track_selection,base.group_portal,0,0,0,0
diff --git a/addons/test_mail/security/test_mail_security.xml b/addons/test_mail/security/test_mail_security.xml
index 296cbdc02da219823b536ecd772e3cf563edf1ac..5e512f6e332edf0ec5289d282de3ececa462b6bc 100644
--- a/addons/test_mail/security/test_mail_security.xml
+++ b/addons/test_mail/security/test_mail_security.xml
@@ -8,4 +8,11 @@
             <field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
         </record>
 
+        <record id="mail_test_multi_company_with_activity_rule" model="ir.rule">
+            <field name="name">Mail Test Multi Company With Activity</field>
+            <field name="model_id" ref="test_mail.model_mail_test_multi_company_with_activity"/>
+            <field eval="True" name="global"/>
+            <field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
+        </record>
+
 </odoo>
diff --git a/addons/test_mail/tests/test_mail_multicompany.py b/addons/test_mail/tests/test_mail_multicompany.py
index c6b92bdc82ed77e5266e426f0744f6b902088561..3b249a4d90751bcbd7e923d824bd1b37f7f3231d 100644
--- a/addons/test_mail/tests/test_mail_multicompany.py
+++ b/addons/test_mail/tests/test_mail_multicompany.py
@@ -108,3 +108,45 @@ class TestMultiCompanySetup(TestMailCommon, TestRecipients):
                     "%s %s" % (company_3.name, test_record.name),
                     "%s@%s" % (self.alias_catchall, self.alias_domain)))
             )
+
+    def test_systray_get_activities(self):
+        self.env["mail.activity"].search([]).unlink()
+        user_admin = self.user_admin.with_user(self.user_admin)
+        test_records = self.env["mail.test.multi.company.with.activity"].create(
+            [
+                {"name": "Test1", "company_id": user_admin.company_id.id},
+                {"name": "Test2", "company_id": self.company_2.id},
+            ]
+        )
+        test_records[0].activity_schedule("test_mail.mail_act_test_todo", user_id=user_admin.id)
+        test_records[1].activity_schedule("test_mail.mail_act_test_todo", user_id=user_admin.id)
+        res_all = user_admin.systray_get_activities()
+        self.assertEqual(
+            res_all[0],
+            {
+                "actions": [{"icon": "fa-clock-o", "name": "Summary"}],
+                "icon": "/base/static/description/icon.png",
+                "model": "mail.test.multi.company.with.activity",
+                "name": "Test Multi Company Mail With Activity",
+                "overdue_count": 0,
+                "planned_count": 0,
+                "today_count": 2,
+                "total_count": 2,
+                "type": "activity",
+            }
+        )
+        res_c2 = user_admin.with_context(allowed_company_ids=[self.company_2.id]).systray_get_activities()
+        self.assertEqual(
+            res_c2[0],
+            {
+                "actions": [{"icon": "fa-clock-o", "name": "Summary"}],
+                "icon": "/base/static/description/icon.png",
+                "model": "mail.test.multi.company.with.activity",
+                "name": "Test Multi Company Mail With Activity",
+                "overdue_count": 0,
+                "planned_count": 0,
+                "today_count": 1,
+                "total_count": 1,
+                "type": "activity",
+            }
+        )