diff --git a/src/api/schedule.py b/src/api/schedule.py
index fdc57440f867889115ab6ab1134ded079cc37490..5721fdf8fdfc1ab7432abea95acc834405e0f77b 100644
--- a/src/api/schedule.py
+++ b/src/api/schedule.py
@@ -14,7 +14,7 @@ from django.conf import settings
 from django.db.models import Prefetch
 
 from core.models.assemblies import Assembly
-from core.models.conference import Conference
+from core.models.conference import Conference, ConferenceMember
 from core.models.events import Event, EventParticipant
 from core.models.rooms import Room
 from core.models.users import PlatformUser
@@ -41,6 +41,7 @@ event_template = {
     'type': 'other',
     'abstract': None,
     'description': None,
+    'logo': None,
     'persons': [],
     'links': [],
 }
@@ -103,59 +104,60 @@ class ScheduleEncoder(json.JSONEncoder):
             return f'{days}:{hours:02d}:{minutes:02d}'
         return f'{hours:02d}:{minutes:02d}'
 
-    def encode_person(self, person: PlatformUser | str | dict):
-        if isinstance(person, str):
-            return {'id': None, 'name': person, 'public_name': person}
+    def encode_person(self, p: EventParticipant | PlatformUser | str | dict):
+        if isinstance(p, str):
+            return {'id': None, 'name': p, 'public_name': p}
 
-        if isinstance(person, PlatformUser):
-            name = person.get_display_name()
+        if isinstance(p, PlatformUser):
+            name = p.get_display_name()
             return {
-                'guid': person.uuid,
+                'guid': p.uuid,
                 'name': name,
                 'public_name': name,
-                'avatar': (settings.PLAINUI_BASE_URL + person.avatar.url) if person.avatar else None,
-                'biography': person.description,
+                'avatar': (settings.PLAINUI_BASE_URL + p.avatar.url) if p.avatar else None,
+                'biography': p.description,
                 # 'links': person.links,  # TODO
-                'url': person.get_absolute_url(),
+                'url': p.get_absolute_url(),
             }
 
-        if isinstance(person, EventParticipant):
-            member = person.event.conference.users.filter(uuid=person.participant.uuid).first()
-            name = person.participant.get_display_name()
+        if isinstance(p, EventParticipant):
+            member: ConferenceMember = p.event.conference.users.filter(uuid=p.participant.uuid).first()
+            name = p.participant.get_display_name()
 
             return {
-                'guid': person.participant.uuid,
+                'guid': p.participant.uuid,
                 'name': name,
                 'public_name': name,
-                'avatar': (settings.PLAINUI_BASE_URL + person.participant.avatar.url) if person.participant.avatar else None,
+                'avatar': (settings.PLAINUI_BASE_URL + p.participant.avatar.url) if p.participant.avatar else None,
                 'biography': member.description if member else '',
                 # 'links': person.participant.links,  # TODO
-                'url': person.participant.get_absolute_url(),
+                'url': p.participant.get_absolute_url(),
             }
 
         # we assume it is a dict, but we normally should never get here
         return {
-            'guid': person.get('guid', None),
-            'id': person.get('id', None),
-            'name': person.get('name', person.get('public_name')),
-            'avatar': person.get('avatar', None),
-            'biography': person.get('biography') or person.get('description', ''),
-            'links': person.get('links', []),
+            'guid': p.get('guid', None),
+            'id': p.get('id', None),
+            'name': p.get('name', p.get('public_name')),
+            'avatar': p.get('avatar', None),
+            'biography': p.get('biography') or p.get('description', ''),
+            'links': p.get('links', []),
         }
 
     def collect_persons(self, event):
         persons = []
 
-        if hasattr(event, 'speakers'):
-            # event is a QuerySet and already fetched speakers
-            persons = event.speakers
-        else:
-            # direct event lookup -> fetch persons via public_speakers
-            persons = event.public_speakers
-
         # TODO remove this workaround once imported speakers are stored as participants
+        #      and have links and biography=description
         if event.additional_data and 'persons' in event.additional_data and len(event.additional_data['persons']) > 0:
-            persons += event.additional_data['persons']
+            persons = event.additional_data['persons']
+        else:
+            if hasattr(event, 'speakers'):
+                # event is a QuerySet and already fetched speakers
+                persons = list(event.speakers)
+            else:
+                # direct event lookup -> fetch persons via public_speakers
+                persons = list(event.public_speakers)
 
         return [self.encode_person(person) for person in persons]
 
@@ -315,6 +317,7 @@ class Schedule:
     def add_events(self, events: 'QuerySet[Event]'):
         events = events.select_related('track', 'room', 'assembly', 'conference').prefetch_related(
             Prefetch(
+                # TODO: we have to prefetch the conference members here, as we need the description for the speakers
                 'participants',
                 queryset=EventParticipant.objects.filter(is_public=True, role=EventParticipant.Role.SPEAKER).select_related('participant'),
                 to_attr='speakers',