diff --git a/src/backoffice/views/events.py b/src/backoffice/views/events.py
index 58bdfe90ca9be9c466edd34bf308aa7ed5fc5483..807e0659b5590d658cf7bf56f49b374aeab636c0 100644
--- a/src/backoffice/views/events.py
+++ b/src/backoffice/views/events.py
@@ -97,6 +97,7 @@ class AssemblyCreateEventView(AssemblyMixin, CreateView):
         form.instance.conference = self.conference
         form.instance.assembly = self.assembly
         form.instance.is_public = False
+        form.instance.kind = Event.Kind.ASSEMBLY
 
         form.instance.save()
         messages.success(self.request, f'Event created (not public yet) with id {form.instance.id}')
diff --git a/src/core/models/conference.py b/src/core/models/conference.py
index 773a09b1e4a4e9d0fb5387147fdf9b95569c7885..922246c2f1b6a2113fab09dc3c9041e8a4b91c19 100644
--- a/src/core/models/conference.py
+++ b/src/core/models/conference.py
@@ -152,6 +152,7 @@ class Conference(models.Model):
         help_text=_('Conference__end__help'),
         verbose_name=_('Conference__end'))
 
+    # TODO Feld auf TimeZoneField umbauen
     timezone = models.CharField(
         choices=[(tz, tz) for tz in pytz.common_timezones],
         max_length=30,
diff --git a/src/core/utils.py b/src/core/utils.py
index d827ab9839b6f3e9242d204041fcbe2f1cc0bf8c..040d023cd14ac530528fc2f5a1633644cb926735 100644
--- a/src/core/utils.py
+++ b/src/core/utils.py
@@ -59,7 +59,7 @@ def render_markdown(markup: str):
     rendered_markup = markdown.markdown(strip_tags(markup), extensions=[ConferenceLinkExtension()] + MARKDOWN_EXTENSIONS)
 
     cleaner = bleach.Cleaner(
-        tags=['br', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'dl', 'table', 'th', 'td', 'tr', 'hr', 'p', 'pre'] + bleach.sanitizer.ALLOWED_TAGS,
+        tags=['br', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'dl', 'table', 'thead', 'tbody', 'th', 'td', 'tr', 'hr', 'p', 'pre'] + bleach.sanitizer.ALLOWED_TAGS,
         attributes={
             '*': ['class'],
             **bleach.sanitizer.ALLOWED_ATTRIBUTES,
diff --git a/src/plainui/jinja2/plainui/base.html b/src/plainui/jinja2/plainui/base.html
index 372c7e27b23f85a1c299ea2c6ed3403f1eccac13..b2ec8befb1ec2083033811bfbc4416ec73dd9eba 100644
--- a/src/plainui/jinja2/plainui/base.html
+++ b/src/plainui/jinja2/plainui/base.html
@@ -51,6 +51,7 @@
                     {%- block content %}{% endblock %}
                 </main>
             {% endblock fullpage -%}
+            {%- block fullpage_add -%}{% endblock fullpage_add -%}
             <footer id="footer" class="mt-auto border-top border-primary py-3 py-xl-5">
                 <ul class="container nav p-0 justify-content-center">
                     <li>
diff --git a/src/plainui/jinja2/plainui/fahrplan.html b/src/plainui/jinja2/plainui/fahrplan.html
index 1cefcfe56765b9875430f40d8caec4b77c3cb6ca..661aa14edc8b638a01bc2a64182ed8dc40dcef07 100644
--- a/src/plainui/jinja2/plainui/fahrplan.html
+++ b/src/plainui/jinja2/plainui/fahrplan.html
@@ -8,6 +8,10 @@
     {{ titleMacro.title(_("schedule"),
         share_url = url('plainui:fahrplan', conf_slug=conf.slug),
         report_url = url('plainui:fahrplan', conf_slug=conf.slug)) }}
+    {% if timezone_warning %}
+    <div class="text-warning">{{ _("Your timezone is configured to %(user_timezone)s, conference timezone is %(conf_timezone)s, showing times in your timezone", user_timezone=current_timezone, conf_timezone=conference_timezone) }}</div>
+    {% endif %}
+
 
     {# TODO: Download options
     <h2>{{ _("download") }}</h2>
@@ -24,7 +28,7 @@
         {% if show_assembly_filters %}<input type="hidden" name="show_assembly_filters" value="y">{% endif %}
         {% if show_track_filters %}<input type="hidden" name="show_track_filters" value="y">{% endif %}
         {% if day %}<input type="hidden" name="day" value="{{day}}">{% endif %}
-        {% if curated %}<input type="hidden" name="curated" value="y">{% endif %}
+        {% if kind %}<input type="hidden" name="kind" value="{{kind}}">{% endif %}
         {% if assembly %}<input type="hidden" name="assembly" value="{{assembly.slug}}">{% endif %}
         {% if track %}<input type="hidden" name="track" value="{{track.slug}}">{% endif %}
 
@@ -35,7 +39,9 @@
         <div class="row justify-content-md-center">
             <button type="submit" name="set" value="fday" class="m-2 btn {{ 'btn-primary active' if show_day_filters else 'btn-secondary'}}">{{ _("by day") }}</button>
             <button type="submit" name="set" value="ftrack" class="m-2 btn {{ 'btn-primary active' if show_track_filters else 'btn-secondary'}}">{{ _("by track") }}</button>
-            <button type="submit" name="set" value="curated" class="m-2 btn {{ 'btn-primary active' if curated else 'btn-secondary'}}">{{ _("curated only") }}</button>
+            <button type="submit" name="set" value="kofficial" class="m-2 btn {{ 'btn-primary active' if kind == 'official' else 'btn-secondary'}}">{{ _("curated only") }}</button>
+            <button type="submit" name="set" value="kassembly" class="m-2 btn {{ 'btn-primary active' if kind == 'assembly' else 'btn-secondary'}}">{{ _("assembly only") }}</button>
+            <button type="submit" name="set" value="ksos" class="m-2 btn {{ 'btn-primary active' if kind == 'sos' else 'btn-secondary'}}">{{ _("selforganized only") }}</button>
             {# Assembly events are displayed on assmbly page. filter here by assembly will mean display serveral hundred assemblies. leave for the future
                 <button type="submit" name="set" value="fassembly" class="m-2 btn {{ 'btn-primary active' if show_assembly_filters else 'btn-secondary'}}">Assembly</button> #}
         </div>
@@ -70,10 +76,19 @@
 
     {% if mode == 'list' %}
         {{ list_events.list(events, my_favorite_events, my_scheduled_events) }}
-    {% elif mode == 'calendar' %}
-        {{ calendar(events) }}
     {% endif %}
 
     <hr class="my-11 border-top-0">
 
 {% endblock %}
+
+{% block fullpage_add %}
+
+    {% if mode == 'calendar' %}
+        <div class="p-5">
+            {{ calendar(events) }}
+            <hr class="my-11 border-top-0">
+        </div>
+    {% endif %}
+
+{% endblock %}
diff --git a/src/plainui/jinja2/plainui/my_fahrplan.html b/src/plainui/jinja2/plainui/my_fahrplan.html
index bcd3ab76126b6f0a10bab0df2c74bde70ef240f2..f35eaef21a07983577f4bb8bf8f3d52ed95a63b4 100644
--- a/src/plainui/jinja2/plainui/my_fahrplan.html
+++ b/src/plainui/jinja2/plainui/my_fahrplan.html
@@ -7,6 +7,9 @@
     {{ titleMacro.title(_("personal schedule"),
         share_url = url('plainui:my_fahrplan', conf_slug=conf.slug),
         report_url = url('plainui:my_fahrplan', conf_slug=conf.slug)) }}
+    {% if timezone_warning %}
+    <div class="text-warning">{{ _("Your timezone is configured to %(user_timezone)s, conference timezone is %(conf_timezone)s, showing times in your timezone", user_timezone=current_timezone, conf_timezone=conference_timezone) }}</div>
+    {% endif %}
 
     {# TODO: Download options
     <h2>{{ _("download") }}</h2>
@@ -23,7 +26,7 @@
         {% if show_assembly_filters %}<input type="hidden" name="show_assembly_filters" value="y">{% endif %}
         {% if show_track_filters %}<input type="hidden" name="show_track_filters" value="y">{% endif %}
         {% if day %}<input type="hidden" name="day" value="{{day}}">{% endif %}
-        {% if curated %}<input type="hidden" name="curated" value="y">{% endif %}
+        {% if kind %}<input type="hidden" name="kind" value="{{kind}}">{% endif %}
         {% if assembly %}<input type="hidden" name="assembly" value="{{assembly.slug}}">{% endif %}
         {% if track %}<input type="hidden" name="track" value="{{track.slug}}">{% endif %}
 
@@ -34,7 +37,10 @@
         <div class="row justify-content-md-center">
             <button type="submit" name="set" value="fday" class="m-2 btn {{ 'btn-primary active' if show_day_filters else 'btn-secondary'}}">{{ _("by day") }}</button>
             <button type="submit" name="set" value="ftrack" class="m-2 btn {{ 'btn-primary active' if show_track_filters else 'btn-secondary'}}">{{ _("by track") }}</button>
-            <button type="submit" name="set" value="curated" class="m-2 btn {{ 'btn-primary active' if curated else 'btn-secondary'}}">{{ _("curated only") }}</button>
+            <button type="submit" name="set" value="kall" class="m-2 btn {{ 'btn-primary active' if kind == 'all' else 'btn-secondary'}}">{{ _("all") }}</button>
+            <button type="submit" name="set" value="kofficial" class="m-2 btn {{ 'btn-primary active' if kind == 'official' else 'btn-secondary'}}">{{ _("curated only") }}</button>
+            <button type="submit" name="set" value="kassembly" class="m-2 btn {{ 'btn-primary active' if kind == 'assembly' else 'btn-secondary'}}">{{ _("assembly only") }}</button>
+            <button type="submit" name="set" value="ksos" class="m-2 btn {{ 'btn-primary active' if kind == 'sos' else 'btn-secondary'}}">{{ _("selforganized only") }}</button>
             {# Assembly events are displayed on assmbly page. filter here by assembly will mean display serveral hundred assemblies. leave for the future
                 <button type="submit" name="set" value="fassembly" class="m-2 btn {{ 'btn-primary active' if show_assembly_filters else 'btn-secondary'}}">Assembly</button> #}
         </div>
@@ -69,10 +75,20 @@
 
     {% if mode == 'list' %}
         {{ list_events.list(events, my_favorite_events, my_scheduled_events) }}
-    {% elif mode == 'calendar' %}
-        {{ calendar(events) }}
     {% endif %}
 
     <hr class="my-11 border-top-0">
 
 {% endblock %}
+
+
+{% block fullpage_add %}
+
+    {% if mode == 'calendar' %}
+        <div class="p-5">
+            {{ calendar(events) }}
+            <hr class="my-11 border-top-0">
+        </div>
+    {% endif %}
+
+{% endblock %}
diff --git a/src/plainui/jinja2/plainui/public_fahrplan.html b/src/plainui/jinja2/plainui/public_fahrplan.html
index f506ab812e7d1596ea2cb09a966757b37c60a65a..f9d5d35ec307d931a496bb7d6db07d0c9966ccec 100644
--- a/src/plainui/jinja2/plainui/public_fahrplan.html
+++ b/src/plainui/jinja2/plainui/public_fahrplan.html
@@ -17,6 +17,9 @@
     </head>
     <body class="rc3-fahrplan__pub-body p-4">
         <h1 class="h2">{{ _("%(conf)s Fahrplan", conf=conf.name) }}</h1>
+        {% if timezone_warning %}
+            <div class="text-warning">{{ _("Your timezone is configured to %(user_timezone)s, conference timezone is %(conf_timezone)s, showing times in your timezone", user_timezone=current_timezone, conf_timezone=conference_timezone) }}</div>
+        {% endif %}
 
         {% if mode == 'list' %}
             {{ list_events.list(events, [], []) }}
diff --git a/src/plainui/locale/de/LC_MESSAGES/django.po b/src/plainui/locale/de/LC_MESSAGES/django.po
index 08786f946453bef2ce15d44fa19fc0e7860ad028..fde3b102317a7b2c4f28d8e970c3cf469a1e2df9 100644
--- a/src/plainui/locale/de/LC_MESSAGES/django.po
+++ b/src/plainui/locale/de/LC_MESSAGES/django.po
@@ -365,6 +365,16 @@ msgstr "nach Track"
 msgid "curated only"
 msgstr "Nur Hauptprogramm"
 
+#, fuzzy
+#| msgid "assembly rooms"
+msgid "assembly only"
+msgstr "Assembly Räume"
+
+#, fuzzy
+#| msgid "Self-organized Session"
+msgid "selforganized only"
+msgstr "Self-organized Session"
+
 msgid "world"
 msgstr ""
 
@@ -452,6 +462,9 @@ msgstr "Hier warten gerade keine Badges auf dich."
 msgid "Redeem Token"
 msgstr "Token einlösen"
 
+msgid "all"
+msgstr ""
+
 msgid "Change Password"
 msgstr "Passwort ändern"
 
@@ -711,7 +724,7 @@ msgid "Bulletin Board Entry deleted."
 msgstr "Bulletin Board Eintrag gelöscht."
 
 msgid "Thank you for your help to make this plattform safer and better! Please give us some time to find a solution and keep an eye on your Messages, we may contact you."
-msgstr ""
+msgstr "Danke für Deine Hilfe diese Plattflorm besser und sicherer zu machen. Bitte gib uns ein wenig Zeit eine Lösung zu finden und behalte deine Nachrichten hier im Auge, villeicht kontaktieren wird Dich."
 
 msgid "Assemblies List"
 msgstr "Assembly-Liste"
@@ -765,6 +778,10 @@ msgstr "Anhänge"
 msgid "schedule"
 msgstr "Zeitplan"
 
+#, python-format
+msgid "Your timezone is configured to %(user_timezone)s, conference timezone is %(conf_timezone)s, showing times in your timezone"
+msgstr "Deine Zeitzone ist auf %(user_timezone)s eingestellt, die Konferenzzeitzone ist %(conf_timezone)s - zeige Uhrzeiten in deiner Zeitzone"
+
 #, python-format
 msgid "Day %(n)s"
 msgstr ""
diff --git a/src/plainui/locale/en/LC_MESSAGES/django.po b/src/plainui/locale/en/LC_MESSAGES/django.po
index 398c56773becf3cfdbb597c840e8854e86e151bd..e4cdd8becb1211e87fc0f75599a14448442a896c 100644
--- a/src/plainui/locale/en/LC_MESSAGES/django.po
+++ b/src/plainui/locale/en/LC_MESSAGES/django.po
@@ -357,6 +357,14 @@ msgstr ""
 msgid "curated only"
 msgstr ""
 
+#, fuzzy
+#| msgid "Assembly Events"
+msgid "assembly only"
+msgstr "Assembly Events"
+
+msgid "selforganized only"
+msgstr ""
+
 msgid "world"
 msgstr ""
 
@@ -444,6 +452,9 @@ msgstr "No badges are waiting for approval."
 msgid "Redeem Token"
 msgstr ""
 
+msgid "all"
+msgstr ""
+
 msgid "Change Password"
 msgstr ""
 
@@ -767,6 +778,10 @@ msgstr ""
 msgid "schedule"
 msgstr ""
 
+#, python-format
+msgid "Your timezone is configured to %(user_timezone)s, conference timezone is %(conf_timezone)s, showing times in your timezone"
+msgstr ""
+
 #, python-format
 msgid "Day %(n)s"
 msgstr ""
diff --git a/src/plainui/styles/components/_fahrplan.scss b/src/plainui/styles/components/_fahrplan.scss
index 0ab60c42a5644f92cf795418114d58b9bb4106fb..7e899f685bb4bafbcfbf1d5a7029e82ae620c13a 100644
--- a/src/plainui/styles/components/_fahrplan.scss
+++ b/src/plainui/styles/components/_fahrplan.scss
@@ -50,8 +50,7 @@
     }
 
     &__room-event {
-        overflow-y: auto;
-        overflow-x: hidden;
+        overflow: hidden;
         overflow-wrap: anywhere;
         border-bottom: 2px solid $body-bg;
         color: $gray-100;
diff --git a/src/plainui/tests.py b/src/plainui/tests.py
index cd59057e9fb4a97edcf8b56550b8418341eb58d0..c344d4f6ab58d85554854d2c7a68ff7e22e61bd7 100644
--- a/src/plainui/tests.py
+++ b/src/plainui/tests.py
@@ -413,6 +413,8 @@ class ViewsTest(TestCase):
         assembly.save()
         room = Room(conference=self.conf, assembly=assembly, name='Some Room')
         room.save()
+        room_public = Room(conference=self.conf, assembly=assembly, name='Public Fahrplan Room', is_public_fahrplan=True)
+        room_public.save()
 
         event = Event(
             conference=self.conf, assembly=assembly, room=room, slug='Event1_1', name='Event1_1', is_public=True, kind=Event.Kind.ASSEMBLY,
@@ -424,6 +426,16 @@ class ViewsTest(TestCase):
             schedule_start=datetime(2020, 1, 2, 0, 50, 1, tzinfo=utc), schedule_duration=timedelta(minutes=45)
         )
         event2.save()
+        event3 = Event(
+            conference=self.conf, assembly=assembly, room=room_public, slug='Event1_3', name='Event1_3', is_public=True,
+            schedule_start=datetime(2020, 1, 2, 0, 55, 1, tzinfo=utc), schedule_duration=timedelta(minutes=45)
+        )
+        event3.save()
+        event4 = Event(
+            conference=self.conf, assembly=assembly, room=room, slug='Event1_4', name='Event1_4', is_public=False,
+            schedule_start=datetime(2020, 1, 2, 1, 0, 1, tzinfo=utc), schedule_duration=timedelta(minutes=45)
+        )
+        event4.save()
 
         self.assertNeedsLogin(reverse('plainui:assemblies_events', kwargs={'conf_slug': self.conf.slug}))
         with freeze_time(datetime(2020, 1, 2, 0, 0, 0, tzinfo=utc)):
@@ -446,7 +458,7 @@ class ViewsTest(TestCase):
             resp = self.client.get(reverse('plainui:assemblies_events', kwargs={'conf_slug': self.conf.slug}))
         self.assertEqual(resp.context_data['conf'], self.conf)
         self.assertEqual(list(resp.context_data['events_from_assemblies']), [event])
-        self.assertEqual(list(resp.context_data['events_upcoming']), [event, event2])
+        self.assertEqual(list(resp.context_data['events_upcoming']), [event, event2, event3])
         self.assertEqual(list(resp.context_data['is_favorite_events']), [str(event.pk)])
         self.assertEqual(list(resp.context_data['is_scheduled_events']), [str(event2.pk)])
 
@@ -1436,7 +1448,7 @@ class ViewsTest(TestCase):
 
         assembly = Assembly(conference=self.conf, slug='assembly1', name='Assembly1', state=Assembly.State.PLACED)
         assembly.save()
-        room = Room(conference=self.conf, assembly=assembly, name='Some Room')
+        room = Room(conference=self.conf, assembly=assembly, name='Some Room', is_public_fahrplan=True)
         room.save()
         track = ConferenceTrack(conference=self.conf, is_public=True, name='Track1')
         track.save()
@@ -1503,7 +1515,7 @@ class ViewsTest(TestCase):
 
         assembly = Assembly(conference=self.conf, slug='assembly1', name='Assembly1', state=Assembly.State.PLACED)
         assembly.save()
-        room = Room(conference=self.conf, assembly=assembly, name='Some Room')
+        room = Room(conference=self.conf, assembly=assembly, name='Some Room', is_public_fahrplan=True)
         room.save()
         event = Event(
             conference=self.conf, assembly=assembly, name='Event1_1', is_public=True, room=room,
diff --git a/src/plainui/views.py b/src/plainui/views.py
index a426f9dd2113e1439d24ad8743e902b995f07bb0..5cf780429b44e6e6fffb3c317ad92e3bb574184a 100644
--- a/src/plainui/views.py
+++ b/src/plainui/views.py
@@ -1,6 +1,7 @@
 from datetime import time, timedelta
 from functools import lru_cache
 from typing import List
+import pytz
 
 from django.conf import settings
 from django.contrib import messages
@@ -350,7 +351,7 @@ class AssembliesEventsView(ConferenceRequiredMixin, TemplateView):
         # not used atm
         # assemblies = Assembly.objects.conference_accessible(self.conf)
         # context['assemblies'] = assemblies
-        context['events_from_assemblies'] = _event_filter(self.request.user, self.conf, curated=False)
+        context['events_from_assemblies'] = _event_filter(self.request.user, self.conf, kinds=[Event.Kind.ASSEMBLY], public_fahrplan=False)
         context['is_favorite_events'] = _session_get_favorite_events(self.request.session, self.request.user)
         context['is_scheduled_events'] = _session_get_scheduled_events(self.request.session, self.request.user)
         context['scope'] = 'assembly'
@@ -1173,7 +1174,7 @@ def _organize_events_for_calendar(conf, events):
 UPCOMING_WINDOW = timedelta(minutes=30)
 
 
-def _event_filter(user, conf, day=None, curated=None, assembly=None, track=None, room=None, user_schedule_only=False, upcoming=False, public_fahrplan=False):
+def _event_filter(user, conf, day=None, kinds=None, assembly=None, track=None, room=None, user_schedule_only=False, upcoming=False, public_fahrplan=None):
     min_date, max_date = conf.start, conf.end
     if min_date is None or max_date is None:
         return Event.objects.none()
@@ -1182,8 +1183,8 @@ def _event_filter(user, conf, day=None, curated=None, assembly=None, track=None,
     if day is not None:
         filters['schedule_start__gte'] = min_date + timedelta(day)
         filters['schedule_start__lt'] = min_date + timedelta(day+1)
-    if curated is not None:
-        filters['kind'] = Event.Kind.OFFICIAL if curated else Event.Kind.ASSEMBLY
+    if kinds is not None:
+        filters['kind__in'] = kinds
     if assembly:
         filters['assembly'] = assembly
     if track:
@@ -1192,8 +1193,8 @@ def _event_filter(user, conf, day=None, curated=None, assembly=None, track=None,
         filters['room'] = room
     if user_schedule_only:
         filters['in_personal_calendar'] = user
-    if public_fahrplan:
-        filters['room__is_public_fahrplan'] = True
+    if public_fahrplan is not None:
+        filters['room__is_public_fahrplan'] = public_fahrplan
 
     events = Event.objects.conference_accessible(conf)
     if upcoming:
@@ -1203,7 +1204,7 @@ def _event_filter(user, conf, day=None, curated=None, assembly=None, track=None,
             room__isnull=False,
             schedule_duration__isnull=False,
             **filters
-        ).exclude(kind=Event.Kind.SELF_ORGANIZED).order_by('schedule_start')
+        ).order_by('schedule_start')
     res = res.annotate(track_name=F('track__name'))
     speakers = EventParticipant.objects.filter(is_public=True, role=EventParticipant.Role.SPEAKER).order_by('participant__username')
     speakers = speakers.annotate(speaker_name=F('participant__username'))
@@ -1224,6 +1225,17 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
         context = super().get_context_data(conf_slug=conf_slug, **kwargs)
         context['conf'] = self.conf
 
+        try:
+            timezone_warning = timezone.get_current_timezone() != pytz.timezone(self.conf.timezone)
+            context['timezone_warning'] = timezone_warning
+            if timezone_warning:
+                current_timezone = timezone.get_current_timezone()
+                if current_timezone is not None:
+                    context['current_timezone'] = current_timezone.zone
+                    context['conference_timezone'] = self.conf.timezone
+        except pytz.UnknownTimeZoneError:
+            context['timezone_warning'] = False
+
         context['my_favorite_events'] = _session_get_favorite_events(self.request.session, self.request.user)
         context['my_scheduled_events'] = _session_get_scheduled_events(self.request.session, self.request.user)
 
@@ -1238,7 +1250,7 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
         context['days'] = n_days
         mode = self.request.GET.get('mode', 'list')
         day = self.request.GET.get('day', None)
-        curated = self.request.GET.get('curated', None)
+        kind = self.request.GET.get('kind', 'official')
         track = self.request.GET.get('track', None)
         assembly = self.request.GET.get('assembly', None)
         show_day_filters = self.request.GET.get('show_day_filters') == 'y'
@@ -1247,8 +1259,10 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
 
         to_set = self.request.GET.get('set', None)
         if to_set:
-            if to_set == 'curated':
-                curated = None if curated else True
+            if to_set[0] == 'k':
+                kind = to_set[1:]
+                if kind not in {'all', 'official', 'assembly', 'sos'}:
+                    kind = 'official'
             elif to_set[0] == 'a':
                 assembly = to_set[1:]
             elif to_set[0] == 'd':
@@ -1278,12 +1292,19 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
             day = None
         context['day'] = day
 
-        # curated could be in genereal none (don't filter), false (only non curated), true (only curated)
-        # not easy to toggle three states with one button and beeing easy to display
-        # for now, the button says "curated only", so it does that.
-        # curated = None if curated is None else curated == 'y'
-        # context['curated'] = curated is not None
-        context['curated'] = curated is not None
+        if kind == 'all':
+            public_fahrplan = None
+            kinds = None
+        elif kind == 'sos':
+            public_fahrplan = False
+            kinds = [Event.Kind.SELF_ORGANIZED]
+        elif kind == 'assembly':
+            public_fahrplan = False
+            kinds = [Event.Kind.ASSEMBLY]
+        else:
+            public_fahrplan = True
+            kinds = None
+        context['kind'] = kind
 
         if show_assembly_filters:
             # TODO show only assemblies that have official / community events
@@ -1302,7 +1323,15 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView):
         else:
             context['track'] = track = None
 
-        events = _event_filter(self.request.user, self.conf, day=day, curated=curated, assembly=assembly, track=track, **self.filter_opts)
+        events = _event_filter(
+            self.request.user,
+            self.conf,
+            day=day,
+            kinds=kinds,
+            assembly=assembly,
+            track=track,
+            public_fahrplan=public_fahrplan,
+            **self.filter_opts)
 
         if mode == 'calendar':
             context['mode'] = 'calendar'
@@ -1327,6 +1356,20 @@ class PublicFahrplanView(ConferenceRequiredMixin, TemplateView):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(conf=self.conf, **kwargs)
         context['mode'] = 'calendar'
+
+        # TODO: Timezone warning macht im public fahrplan keinen Sinn, wir stirppen momentan die Sessions im Loadbalancer.
+        #       Da sollten wir immer in der offiziellen Zeit anzeigen. Eventuell mit dauerhaftem Timezone-Hinweis?
+        try:
+            timezone_warning = self.conf.timezone and timezone.get_current_timezone() != pytz.timezone(self.conf.timezone)
+            context['timezone_warning'] = timezone_warning
+            if timezone_warning:
+                current_timezone = timezone.get_current_timezone()
+                if current_timezone is not None:
+                    context['current_timezone'] = current_timezone.zone
+                    context['conference_timezone'] = self.conf.timezone
+        except pytz.UnknownTimeZoneError:
+            context['timezone_warning'] = False
+
         events = _event_filter(self.request.user, self.conf, public_fahrplan=True)
         # events = _event_filter(self.request.user, self.conf)
         context['events'] = _organize_events_for_calendar(self.conf, events)