diff --git a/src/backoffice/templates/backoffice/event/components/list_content.html b/src/backoffice/templates/backoffice/event/components/list_content.html
index 725a8ffd512136139afe8d4788b61bd29359ad8b..b43ba5382a133f5367a70f46f12cffafa676dd3e 100644
--- a/src/backoffice/templates/backoffice/event/components/list_content.html
+++ b/src/backoffice/templates/backoffice/event/components/list_content.html
@@ -36,8 +36,12 @@
       <tbody>
         {% for event in events %}
           <tr class="{% if not event.is_public %}text-muted{% endif %}">
-            <td>{{ event.schedule_start }}</td>
-            <td>{{ event.schedule_duration }}</td>
+            <td data-order="{{ event.schedule_start|date:"U" }}">
+              <abbr title="{{ event.schedule_start|date:"c" }}">{{ event.schedule_start|conference_time:conference }}</abbr>
+            </td>
+            <td data-order="{{ event.schedule_duration.total_seconds|default:"0" }}">
+              {{ event.schedule_duration|naturaltimespan }}
+            </td>
             <td>
               {% if user_list and event.kind == 'sos' %}
                 <a href="{% url 'backoffice:sos-edit' pk=event.pk %}">{{ event.name }}</a>
diff --git a/src/backoffice/templatetags/c3assemblies.py b/src/backoffice/templatetags/c3assemblies.py
index 5539f5fcccb9e9e8faebc0e36a3687a9a089aa30..b18a74875547123857409042166018ec6e19ddd5 100644
--- a/src/backoffice/templatetags/c3assemblies.py
+++ b/src/backoffice/templatetags/c3assemblies.py
@@ -45,8 +45,11 @@ def get_language_item(dictionary):
 
 
 @register.filter
-def naturaltimespan(x):
-    assert isinstance(x, timedelta), str.format('Expected a timedelta object: {0!r}', x)
+def naturaltimespan(x: timedelta) -> str or None:
+    if x is None:
+        return ''
+    if not isinstance(x, timedelta):
+        raise ValueError('Expected a timedelta object.')
 
     seconds = x.total_seconds()
 
diff --git a/src/core/locale/de/LC_MESSAGES/django.po b/src/core/locale/de/LC_MESSAGES/django.po
index 2590c45300c4711618eb412bdc2876a9566d6292..c392c9da1a197f5fe2d341ec22000def4f12ade0 100644
--- a/src/core/locale/de/LC_MESSAGES/django.po
+++ b/src/core/locale/de/LC_MESSAGES/django.po
@@ -2466,6 +2466,9 @@ msgstr ""
 msgid "Activate your %(safe_site_name)s account"
 msgstr "Aktiviere dein %(safe_site_name)s Konto"
 
+msgid "Conference-day"
+msgstr "Tag"
+
 #, python-format
 msgid "Validation__error_file_size_MB_exceeded %(max_size)d"
 msgstr "Die Datei darf nicht größer als %(max_size)dMb sein"
diff --git a/src/core/locale/en/LC_MESSAGES/django.po b/src/core/locale/en/LC_MESSAGES/django.po
index 608a666a79bb31b449a9466da58b8defb0ad87f2..95eeb5c3b21d076de54cc07009669a76e8f1bb63 100644
--- a/src/core/locale/en/LC_MESSAGES/django.po
+++ b/src/core/locale/en/LC_MESSAGES/django.po
@@ -2448,6 +2448,9 @@ msgstr ""
 msgid "Activate your %(safe_site_name)s account"
 msgstr ""
 
+msgid "Conference-day"
+msgstr "day"
+
 #, python-format
 msgid "Validation__error_file_size_MB_exceeded %(max_size)d"
 msgstr "You aren't allowed to upload a file larger than %(max_size)dMb"
diff --git a/src/core/templatetags/conference_time.py b/src/core/templatetags/conference_time.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bac3e6a1e157f85e5bbbbba6b363ece691e1efa
--- /dev/null
+++ b/src/core/templatetags/conference_time.py
@@ -0,0 +1,29 @@
+from datetime import datetime
+
+from django.template.defaulttags import register
+from django.utils import timezone
+from django.utils.translation import gettext_lazy as _
+
+from core.models import Conference
+
+
+@register.filter
+def conference_time(timestamp: datetime, conf: Conference):
+    if timestamp is None:
+        return ''
+
+    # derive conference day from given timestamp
+    day = conf.get_conference_day(timestamp)
+    day_i18n = _('Conference-day')
+
+    # convert timestamp to current timezone
+    local_ts = timezone.localtime(timestamp)
+
+    # convert midnight to 24:00
+    h = local_ts.hour
+    if h == 0:
+        h = 24
+    m = local_ts.minute
+
+    # return formatted string
+    return f'{day_i18n} {day} @ {h:02d}:{m:02d}'
diff --git a/src/plainui/jinja2.py b/src/plainui/jinja2.py
index 2677ce6ce025e927519f7457abe8663890209993..7365c3a327e7084da0485e6ecd2c0b994b94e0ca 100644
--- a/src/plainui/jinja2.py
+++ b/src/plainui/jinja2.py
@@ -22,6 +22,7 @@ from modeltranslation.fields import build_localized_fieldname
 from modeltranslation.settings import AVAILABLE_LANGUAGES
 
 from core.models import PlatformUser, UserBadge
+from core.templatetags.conference_time import conference_time
 from core.templatetags.hub_absolute import hub_absolute, hub_absolute_self
 from core.templatetags.update_parameters import update_parameters
 
@@ -302,6 +303,7 @@ def environment(**options):
             'link_icon': link_icon,
         }
     )
+    env.filters['conference_time'] = conference_time
     env.filters['strftdelta'] = custom_timedelta
     env.filters['strftdelta_short'] = custom_timedelta_short
     env.filters['strftimehm'] = custom_strftimehm
diff --git a/src/plainui/views/general.py b/src/plainui/views/general.py
index bf9e14f23aaaf45b55b8abdbb5bda015cfd68a02..bc3f1074e19ccc541411782fffbddfc26074fe79 100644
--- a/src/plainui/views/general.py
+++ b/src/plainui/views/general.py
@@ -126,10 +126,12 @@ class TagView(ConferenceRequiredMixin, TemplateView):
         context['tag'] = tag
 
         # TODO other types. What should we link here?
+        # TODO: consider using views.utils.event_filter() here
         context['events'] = (
             Event.objects.conference_accessible(self.conf)
             .filter(id__in=TagItem.objects.filter(tag=tag, target_type=ContentType.objects.get_for_model(Event)).values_list('target_id'))
             .filter(schedule_start__isnull=False, schedule_end__isnull=False)
+            .order_by('schedule_start', 'schedule_end')
         )
         context['my_favorite_events'] = session_get_favorite_events(self.request.session, self.request.user)