diff --git a/src/core/admin.py b/src/core/admin.py
index c8c43c2d5a749b929cceb0a0a194d673b0da6a45..53d7b59b8add694d25d18e50e932e9b72f8fc178 100644
--- a/src/core/admin.py
+++ b/src/core/admin.py
@@ -700,7 +700,7 @@ class EventAdmin(admin.ModelAdmin):
         return super().formfield_for_foreignkey(db_field, request, **kwargs)
 
     def get_fieldsets(self, request, obj=None, **kwargs):
-        if obj is None:
+        if obj is None and '_saveasnew' not in request.POST:
             return [
                 (
                     'Organisation',
@@ -722,7 +722,7 @@ class EventAdmin(admin.ModelAdmin):
     def get_readonly_fields(self, request, obj=None, **kwargs):
         # upon creation the user may select a conference
         if obj is None:
-            return ['id']
+            return ['id', 'get_is_imported']
         return super().get_readonly_fields(request, obj, **kwargs)
 
     def get_is_imported(self, instance):
diff --git a/src/core/models/events.py b/src/core/models/events.py
index c05859c5818348c64210734f4037a2a62c5651b5..19ea075f7122435c7d853ac2827e97a75b946e57 100644
--- a/src/core/models/events.py
+++ b/src/core/models/events.py
@@ -190,12 +190,32 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model):
 
     last_update = models.DateTimeField(auto_now=True)
 
+    # if _can_manage is set, user can edit event. This is a cache variable for the can_manage property
+    _can_manage = None
+
     def get_absolute_url(self):
         from core.templatetags.hub_absolute import hub_absolute  # pylint: disable=import-outside-toplevel
 
         return hub_absolute('plainui:event', event_slug=self.slug, i18n=settings.ARCHIVE_MODE)
 
-    @property
+    def can_manage(self, user=None):
+        if self._can_manage is None:
+            if not user or not user.is_authenticated:
+                # guests are not allowed to manage anything
+                self._can_manage = False
+                return False
+
+            if self.is_sos and user and self.owner == user:
+                # the owner of a self-organized session can always manage it
+                self._can_manage = True
+                return True
+
+            if self.assembly:
+                self._can_manage = self.assembly.user_can_manage(user, staff_can_manage=True)
+
+        return self._can_manage
+
+    @cached_property
     def public_speakers(self) -> list:
         """Returns a list of all public speakers of this event."""
         persons = [participant.participant for participant in self.participants.filter(is_public=True, role=EventParticipant.Role.SPEAKER)]
diff --git a/src/plainui/jinja2/plainui/event.html.j2 b/src/plainui/jinja2/plainui/event.html.j2
index b47091dc2dd93369bea23a0815cc51c24442a090..2c27246351a9e800806aad55ada80dadfc7a43ce 100644
--- a/src/plainui/jinja2/plainui/event.html.j2
+++ b/src/plainui/jinja2/plainui/event.html.j2
@@ -33,9 +33,11 @@
         <li class="breadcrumb-item">
           <a href="{{ url('plainui:index') }}">{{ conf.name }}</a>
         </li>
-        <li class="breadcrumb-item">
-          <a href="{{ url('plainui:assemblies') }}">{{ _("assemblies") }}</a>
-        </li>
+        {% if not assembly.is_official %}
+          <li class="breadcrumb-item">
+            <a href="{{ url('plainui:assemblies') }}">{{ _("assemblies") }}</a>
+          </li>
+        {% endif %}
         <li class="breadcrumb-item">
           <a href="{{ url('plainui:assembly', assembly_slug=assembly.slug) }}">{{ assembly.name }}</a>
         </li>
@@ -128,6 +130,11 @@
             </div>
 
             <div>
+              {%- if not event.is_sos and can_manage -%}
+                {{ fbtns.edit(hub_absolute('backoffice:assembly-event', assembly=assembly.id, pk=event.id) , color="secondary") }}
+              {%- elif event.is_sos and can_manage -%}
+                {{ fbtns.edit(hub_absolute('backoffice:sos-edit', pk=event.id) , color="secondary") }}
+              {% endif %}
               {{ fbtns.fav(event.id, "event", is_favorite, color="secondary") }}
               {{ fbtns.report(lookup_key=event.slug, color="primary") }}
               {% if event.additional_data.get('feedback_url') and running_state == "complete" %}
diff --git a/src/plainui/views/events.py b/src/plainui/views/events.py
index 535ff95b0adf5941f0c6d808a7e481858efea78b..7a82df3a87fd33e120a908f6af2d7ca728679d40 100644
--- a/src/plainui/views/events.py
+++ b/src/plainui/views/events.py
@@ -49,6 +49,7 @@ class EventView(ConferenceRequiredMixin, TemplateView):
         favorites = session_get_favorite_events(self.request.session, self.request.user)
         context['is_favorite'] = str(event.id) in favorites
         context['is_favorite_events'] = favorites
+        context['can_manage'] = event.can_manage(self.request.user)
         context['speakers'] = event.public_speakers
         context['tags'] = TagItem.objects.select_related('tag').filter(
             tag__is_public=True, target_type=ContentType.objects.get_for_model(Event), target_id=event.pk