diff --git a/src/core/models/users.py b/src/core/models/users.py
index 134d8cc414d51ce4e9f022af77a32f78eea68b56..07d73c7325b7701bd08d82be117b2506bb1ba364 100644
--- a/src/core/models/users.py
+++ b/src/core/models/users.py
@@ -1,5 +1,6 @@
 import logging
 import re
+from contextlib import suppress
 from pathlib import Path
 from random import choices
 from string import ascii_lowercase, digits
@@ -243,8 +244,30 @@ class PlatformUser(AbstractUser):
     def is_person(self):
         return self.user_type in self.PERSON_TYPES
 
+    @cached_property
+    def name(self) -> str:
+        """
+        Shows the display name with username if they differ.
+
+        This is used to make the name available in a way matching other models (e.g. for invitations).
+
+        ReturnsL
+            str: The users display name.
+        """
+        name = self.display_name
+        if self.first_name or self.last_name:
+            name += f' <{self.username}>'
+        return name
+
     def get_display_name(self):
-        result = self.username if self.user_type != self.Type.SPEAKER else (self.first_name + ' ' + self.last_name).strip()
+        result = ''
+        if self.first_name:
+            result += self.first_name
+        if self.last_name:
+            result += f' {self.last_name}'
+        result = result.strip()
+        if not result:
+            result = self.username
         if self.pronouns:
             result += f' ({self.pronouns})'
         return result
@@ -344,6 +367,8 @@ class PlatformUser(AbstractUser):
 
         # update the display name
         self.display_name = self.get_display_name()
+        with suppress(AttributeError):
+            del self.name  # delete the cached property to force a refresh
 
         return super().save(*args, update_fields=update_fields, **kwargs)
 
diff --git a/src/core/tests/users.py b/src/core/tests/users.py
index 8f7d86b228aba0fc438f70386b91d574d5547b1c..60f308c2916dcdb41777a1c4f2ae17d19f967977 100644
--- a/src/core/tests/users.py
+++ b/src/core/tests/users.py
@@ -163,3 +163,34 @@ class UserRegistrationTests(TestCase):
         self.assertEqual(response.status_code, 302)
         user = PlatformUser.objects.get(username=username)
         self.assertTrue(len(user.slug) > 0)
+
+
+class UserNameTests(TestCase):
+    def setUp(self) -> None:
+        self.user = PlatformUser(username='bernd')
+        self.user.save()
+
+    def test_name_output(self):
+        self.assertEqual(self.user.display_name, 'bernd')
+        self.assertEqual(self.user.name, 'bernd')
+
+        self.user.first_name = 'Bernd'
+        self.user.save()
+        self.user.refresh_from_db()
+
+        self.assertEqual(self.user.display_name, 'Bernd')
+        self.assertEqual(self.user.name, 'Bernd <bernd>')
+
+        self.user.last_name = 'Brot'
+        self.user.save()
+        self.user.refresh_from_db()
+
+        self.assertEqual(self.user.display_name, 'Bernd Brot')
+        self.assertEqual(self.user.name, 'Bernd Brot <bernd>')
+
+        self.user.pronouns = 'das'
+        self.user.save()
+        self.user.refresh_from_db()
+
+        self.assertEqual(self.user.display_name, 'Bernd Brot (das)')
+        self.assertEqual(self.user.name, 'Bernd Brot (das) <bernd>')
diff --git a/src/plainui/jinja2/plainui/user.html.j2 b/src/plainui/jinja2/plainui/user.html.j2
index 6f8f97ea3062c238e9159a5a7a5534ad80d6181f..32c954191bb1da131ad820aafac90f83918e3bf3 100644
--- a/src/plainui/jinja2/plainui/user.html.j2
+++ b/src/plainui/jinja2/plainui/user.html.j2
@@ -14,7 +14,7 @@
 {% endblock title %}
 {% block content %}
 
-  {{ navMacro.top_nav(_("User Profile") ) }}
+  {{ navMacro.top_nav(_("User Profile %(username)s", username=display_user.username) ) }}
 
   <div class="hub-vlayout">
     <div class="hub-row">
diff --git a/src/plainui/locale/de/LC_MESSAGES/django.po b/src/plainui/locale/de/LC_MESSAGES/django.po
index 4d7fa38288aa558ebd095fd0fff06635de9b0d20..2d02369dfcd82ff74c89588de6c4b667f5a2848e 100644
--- a/src/plainui/locale/de/LC_MESSAGES/django.po
+++ b/src/plainui/locale/de/LC_MESSAGES/django.po
@@ -1087,5 +1087,6 @@ msgstr "Kommende Events"
 msgid "%(conf)s - User %(name)s"
 msgstr ""
 
-msgid "User Profile"
-msgstr "Profil"
+#, python-format
+msgid "User Profile %(username)s"
+msgstr "Profil: %(username)s"
diff --git a/src/plainui/locale/en/LC_MESSAGES/django.po b/src/plainui/locale/en/LC_MESSAGES/django.po
index 9471456f32cfeff75332c7b02c8f442ffdf83014..3e63a2246b0737894c1febf00fd4f8c91d4a45b1 100644
--- a/src/plainui/locale/en/LC_MESSAGES/django.po
+++ b/src/plainui/locale/en/LC_MESSAGES/django.po
@@ -1087,5 +1087,6 @@ msgstr ""
 msgid "%(conf)s - User %(name)s"
 msgstr ""
 
-msgid "User Profile"
-msgstr ""
+#, python-format
+msgid "User Profile %(username)s"
+msgstr "User Profile %(username)s"