diff --git a/src/backoffice/forms.py b/src/backoffice/forms.py
index 70c60d5d6d321bd4c94f01d6a01820faee16d9c5..e4482cf688867b6917aceded0a62c0e0b0ee4599 100644
--- a/src/backoffice/forms.py
+++ b/src/backoffice/forms.py
@@ -36,7 +36,7 @@ from core.utils import str2timedelta
 logger = logging.getLogger(__name__)
 
 
-class ConferenceForm(forms.Form):
+class ConferenceSelectionForm(forms.Form):
     conference_slug = forms.SlugField()
 
 
diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po
index 11c65a72bf3f769a6f4e0b96579b011061be6843..67f12b5e089629e86c64a8985c5285d280ba798d 100644
--- a/src/backoffice/locale/de/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/de/LC_MESSAGES/django.po
@@ -819,6 +819,9 @@ msgstr "Karte"
 msgid "nav_moderation"
 msgstr "Moderation"
 
+msgid "nav_conference_admin"
+msgstr "Konferenz"
+
 msgid "nav_wiki"
 msgstr "Wiki"
 
@@ -828,9 +831,12 @@ msgstr "Schedules"
 msgid "nav_workadventure"
 msgstr "WorkAdventure"
 
-msgid "conference_selection"
+msgid "Conference__Selection"
 msgstr "Konferenz auswählen"
 
+msgid "Conferences"
+msgstr "Konferenzen"
+
 msgid "nav_profile"
 msgstr "Profil"
 
@@ -849,6 +855,45 @@ msgstr "alle"
 msgid "backoffice__not_a_conference_member"
 msgstr "Das Nutzerkonto, mit dem du gerade angemeldet bist, ist zur Zeit nicht mit einem Veranstaltungsticket verknüpft. Wenn Du gerade beim Aufbau hilfst, ist das kein Problem. Denk aber bitte daran, rechtzeitig ein Ticket zu kaufen und dies kurz vor Veranstaltungsbeginn mit deinem Nutzerkonto zu verknüpfen. Ansonsten kannst Du mit diesem Nutzerkonto nicht an der Veranstaltung teilnehmen."
 
+msgid "create"
+msgstr "Erstellen"
+
+msgid "Conference__recall__warning__header"
+msgstr "Konferenz wirklich zurücknehmen?"
+
+msgid "Conference__recall__warning__text"
+msgstr "Mit dieser Aktion wird die Konferenz zurückgenommen und ist ab diesem Zeitpunkt nicht mehr öffentlich sichtbar!"
+
+msgid "Conference__recall__submit"
+msgstr "Konferenz zurücknehmen"
+
+msgid "Conference__publish__warning__header"
+msgstr "Konferenz wirklich veröffentlichen?"
+
+msgid "Conference__publish__warning__text"
+msgstr "Bitte stelle sicher, dass alle Informationen der Konferenz korrekt sind. Mit dieser Aktion wird die Konferenz für die Öffentlichkeit sichtbar!"
+
+msgid "Conference__publish__submit"
+msgstr "Konferenz veröffentlichen"
+
+msgid "create conference"
+msgstr "Konferenz erstellen"
+
+msgid "edit conference"
+msgstr "Konferenz bearbeiten"
+
+msgid "Conference__recall__introduction"
+msgstr "Die Konferenz ist aktuell sichtbar und du kannst es mittels des Öffentlichen Links besuchen. Zusätzlich kannst du die Veranstaltung auch wieder zurücknehmen."
+
+msgid "Conference__publish__introduction"
+msgstr "Die Konferenz ist aktuell noch nicht öffentlich! Mit der Veröffentlichung wird diese Konferenz für alle sichtbar. Bitte kontrolliere vorher alle Daten!"
+
+msgid "Conference__edit-metadata"
+msgstr "Konferenz-Daten"
+
+msgid "Conference__submit"
+msgstr "Konferenz speichern"
+
 msgid "Conferences__selection__header"
 msgstr "Konferenz auswählen"
 
@@ -1174,9 +1219,6 @@ msgstr "Self-organized Projekte"
 msgid "Project__So__create"
 msgstr "Self-organized Projekt erstellen"
 
-msgid "create"
-msgstr "Erstellen"
-
 msgid "Project__recall__warning__header"
 msgstr "Projekt wirklich zurücknehmen?"
 
@@ -1826,6 +1868,36 @@ msgstr "abgelehnt"
 msgid "nav_channels_hidden"
 msgstr "versteckt"
 
+msgid "nav_conference"
+msgstr "Konferenz"
+
+msgid "Conference__Publication"
+msgstr "Veröffentlichung"
+
+msgid "Conference__Registration"
+msgstr "Assembly Registrierung"
+
+msgid "Conference__publish__success"
+msgstr "Die Konferenz wurde erfolgreich veröffentlicht! Viel Spaß!"
+
+msgid "Conference__recall__success"
+msgstr "Die Konferenz wurde erfolgreich zurückgenommen."
+
+msgid "Conference__create__success"
+msgstr "Die Konferenz wurde erfolgreich angelegt!"
+
+msgid "Conference__update__success"
+msgstr "Die Veröffentlichungsinformationen der Konferenz wurden angepasst."
+
+msgid "Conference__publish__failed"
+msgstr "Beim veröffentlichen der Konferenz ist ein Fehler aufgetreten"
+
+msgid "Conference__form__invalid"
+msgstr "Die angegebenen Daten zur Konferenz sind fehlerhaft!"
+
+msgid "Conference__registration_update__success"
+msgstr "Die Registrierungsinformationen der Konferenz wurden angepasst."
+
 #, python-format
 msgid "Event__publish__failed %(event_type)s"
 msgstr "Fehler beim veröffentlichen der %(event_type)s!"
diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po
index 21c3fd49ddfc124b0d70be94acd4faace58bae4c..f55f82ac8283574887740a9c5c873128dd7a5aa9 100644
--- a/src/backoffice/locale/en/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/en/LC_MESSAGES/django.po
@@ -818,6 +818,9 @@ msgstr "map"
 msgid "nav_moderation"
 msgstr "moderation"
 
+msgid "nav_conference_admin"
+msgstr "Conference"
+
 msgid "nav_wiki"
 msgstr "Wiki"
 
@@ -827,9 +830,12 @@ msgstr "Schedules"
 msgid "nav_workadventure"
 msgstr "WorkAdventure"
 
-msgid "conference_selection"
+msgid "Conference__Selection"
 msgstr "Select Conference"
 
+msgid "Conferences"
+msgstr "Conferences"
+
 msgid "nav_profile"
 msgstr "Profile"
 
@@ -848,6 +854,45 @@ msgstr "all"
 msgid "backoffice__not_a_conference_member"
 msgstr "The user account you are currently logged in with is not linked to an valid event ticket. If you are helping with the set-up, this is not a problem. But please remember to buy a ticket in time and link it to your user account. Otherwise you will not be able to participate in the event with this user account. Linking the ticket to the user account will be available directly before the event."
 
+msgid "create"
+msgstr ""
+
+msgid "Conference__recall__warning__header"
+msgstr "Do you really want to recall the conference?"
+
+msgid "Conference__recall__warning__text"
+msgstr "With this action, the conference is recalled and is no longer publicly visible from this point on!"
+
+msgid "Conference__recall__submit"
+msgstr "Recall conference"
+
+msgid "Conference__publish__warning__header"
+msgstr "Really publish conference?"
+
+msgid "Conference__publish__warning__text"
+msgstr "Please make sure that all conference information is correct. This action will make the conference visible to the public!"
+
+msgid "Conference__publish__submit"
+msgstr "Publish conference"
+
+msgid "create conference"
+msgstr "Create Conference"
+
+msgid "edit conference"
+msgstr "Edit Conference"
+
+msgid "Conference__recall__introduction"
+msgstr "The conference is currently visible and you can visit it using the public link. You can also cancel the conference again."
+
+msgid "Conference__publish__introduction"
+msgstr "The conference is currently not yet public! With the publication this conference will be visible for everyone. Please check all data beforehand!"
+
+msgid "Conference__edit-metadata"
+msgstr "conference data"
+
+msgid "Conference__submit"
+msgstr "Recall conference"
+
 msgid "Conferences__selection__header"
 msgstr "Select Conference"
 
@@ -1181,9 +1226,6 @@ msgstr "Self-organized project"
 msgid "Project__So__create"
 msgstr "Create self-organized project"
 
-msgid "create"
-msgstr ""
-
 msgid "Project__recall__warning__header"
 msgstr "Do you really recall the event?"
 
@@ -1833,6 +1875,36 @@ msgstr "rejected"
 msgid "nav_channels_hidden"
 msgstr "hidden"
 
+msgid "nav_conference"
+msgstr "Conference"
+
+msgid "Conference__Publication"
+msgstr "Publication Settings"
+
+msgid "Conference__Registration"
+msgstr "Assembly Registration"
+
+msgid "Conference__publish__success"
+msgstr "Conference was successfully published! Have fun!"
+
+msgid "Conference__recall__success"
+msgstr "Conference was successfully recalled."
+
+msgid "Conference__create__success"
+msgstr "Conference was successfully crewated."
+
+msgid "Conference__update__success"
+msgstr "Conference was successfully updated."
+
+msgid "Conference__publish__failed"
+msgstr "Failed to publish the conference!"
+
+msgid "Conference__form__invalid"
+msgstr "Conference data you entered is invalid!"
+
+msgid "Conference__registration_update__success"
+msgstr "Conference registration information was successfully updated."
+
 #, python-format
 msgid "Event__publish__failed %(event_type)s"
 msgstr "Error while publishing the %(event_type)s"
diff --git a/src/backoffice/templates/backoffice/base.html b/src/backoffice/templates/backoffice/base.html
index 20517eae6134b4aba2e45363d99adb33c7f69c65..f66127feed4d9cc53a145fe2b3cf80f7bd5e4d15 100644
--- a/src/backoffice/templates/backoffice/base.html
+++ b/src/backoffice/templates/backoffice/base.html
@@ -54,6 +54,11 @@
             <a class="nav-link{% if active_page == 'moderation' %} active{% endif %}" href="{% url 'backoffice:moderation' %}">{% trans "nav_moderation" %}{% if active_page == 'moderation' %} <span class="visually-hidden">{{ activetab_srmarker }}</span>{% endif %}</a>
           </li>
           {% endif %}
+          {% if has_conference_admin or has_assembly_registration_admin %}
+          <li class="nav-item">
+            <a class="nav-link{% if active_page == 'conference_admin' %} active{% endif %}" href="{% url 'backoffice:conference-publication' conference.id %}">{% trans "nav_conference_admin" %}{% if active_page == 'conference_admin' %} <span class="visually-hidden">{{ activetab_srmarker }}</span>{% endif %}</a>
+          </li>
+          {% endif %}
           {% if has_pages %}
           <li class="nav-item">
             <a class="nav-link{% if active_page == 'wiki' %} active{% endif %}" href="{% url 'backoffice:wiki' %}">{% trans "nav_wiki" %}{% if active_page == 'wiki' %} <span class="visually-hidden">{{ activetab_srmarker }}</span>{% endif %}</a>
@@ -71,10 +76,10 @@
           {% endif %}
         </ul>
         <ul class="navbar-nav">
-          {% if conferences|length > 1 or active_page == 'conference_selection' %}
-          <li class="nav-item{% if active_page == 'conference_selection' %} active{% endif %}">
-            <a class="nav-link" href="{% url 'backoffice:conference_selection' %}" title="{% trans 'conference_selection' %}">
-              {{ conference.slug }}
+          {% if conferences|length > 1 or active_page == 'conferences' %}
+          <li class="nav-item{% if active_page == 'conferences' %} active{% endif %}">
+            <a class="nav-link" href="{% url 'backoffice:conferences' %}" title="{% trans 'Conference__Selection' %}">
+              {% trans 'Conferences' %}
             </a>
           </li>
           {% endif %}
diff --git a/src/backoffice/templates/backoffice/conferences/publication_edit.html b/src/backoffice/templates/backoffice/conferences/publication_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..760369f3481bb2569b83b3ed8c903f2d5676f5c3
--- /dev/null
+++ b/src/backoffice/templates/backoffice/conferences/publication_edit.html
@@ -0,0 +1,120 @@
+{% extends 'backoffice/base.html' %}
+{% load django_bootstrap5 %}
+{% load i18n %}
+{% load static %}
+{% block title %}
+  {% if form.create %}
+    {% trans 'create' %}
+  {% else %}
+    {{ form.instance.name }}
+  {% endif %}
+{% endblock title %}
+{% block scripts %}
+  <script src="{% static "backoffice/modal.js" %}"></script>
+  <script>
+  $(document).ready(() => {
+    showModal = registerModal()
+    publishConference = document.getElementById('publishConference');
+    if(publishConference){
+      document.getElementById('publishConference').addEventListener('click', (e) => {
+        e.preventDefault();
+        if (document.getElementById('id_is_public').value === "True"){
+          showModal(
+            () => {
+              form = document.getElementById('ConferenceForm');
+              form.action = publishConference.formAction
+              form.submit()
+            },
+            'warning',
+            '{% trans "Conference__recall__warning__header" %}',
+            '{% trans "Conference__recall__warning__text" %}',
+            '{% trans "Conference__recall__submit" %}')
+        } else {
+          showModal(
+            () => {
+              form = document.getElementById('ConferenceForm');
+              form.action = publishConference.formAction
+              form.submit()
+            },
+            'warning',
+            '{% trans "Conference__publish__warning__header" %}',
+            '{% trans "Conference__publish__warning__text" %}',
+            '{% trans "Conference__publish__submit" %}')
+        }
+      })
+    };
+  });
+  </script>
+{% endblock scripts %}
+{% block content %}
+  {% url 'backoffice:conference-publication' pk=form.instance.id assembly=form.instance.assembly.id as edit_url %}
+  <form method="POST" enctype="multipart/form-data" id="ConferenceForm">
+    {% csrf_token %}
+    <div class="card border-default">
+      <div class="card-header bg-default">
+        {% if form.create %}
+          {% blocktrans %}create conference{% endblocktrans %}
+        {% else %}
+          {% blocktrans %}edit conference{% endblocktrans %}
+        {% endif %}
+      </div>
+      <div class="card-body">
+        {% if has_form_perms and form.instance.is_public and not form.create %}
+          <div class="alert alert-success d-flex">
+            <div class="flex-grow-0 pe-3">
+              <i class="bi bi-megaphone fs-1"></i>
+            </div>
+            <div class="flex-grow-1 px-3">{% blocktrans %}Conference__recall__introduction{% endblocktrans %}</div>
+            <div class="d-inline-flex gap-2 align-items-start">
+              <a class="float-end btn btn-info me-2"
+                 href="{% url 'plainui:index' %}">{% trans 'public_link' %}</a>
+              <button class="btn btn-warning float-end"
+                      id="publishConference"
+                      formaction="{{ edit_url }}?recall=true">{% trans "Conference__recall__submit" %}</button>
+            </div>
+          </div>
+        {% elif has_form_perms and not form.create %}
+          <div class="alert alert-warning d-flex">
+            <div class="flex-grow-0 pe-3">
+              <i class="bi bi-eye-slash fs-1"></i>
+            </div>
+            <div class="flex-grow-1 px-3">{% blocktrans %}Conference__publish__introduction{% endblocktrans %}</div>
+            <div class="d-inline-flex gap-2 align-items-start">
+              <button class="btn btn-primary float-end"
+                      id="publishConference"
+                      formaction="{{ edit_url }}?publish=true"
+                      {% if publication_errors %}disabled{% endif %}>{% trans "Conference__publish__submit" %}</button>
+            </div>
+          </div>
+        {% endif %}
+        {% if form.errors %}<div class="alert alert-danger">{{ form.errors }}</div>{% endif %}
+
+        <input id="id_is_public"
+               type="hidden"
+               name="{{ form.is_public.name }}"
+               value="{{ form.is_public.value }}">
+
+        <p class="fw-bold border-bottom mb-3">{% trans "Conference__edit-metadata" %}</p>
+        <div class="row mb-3">
+          <div class="col-md-4">{% bootstrap_field form.name %}</div>
+          <div class="col-md-4">{% bootstrap_field form.slug %}</div>
+          <div class="col-md-4">{% bootstrap_field form.timezone %}</div>
+        </div>
+        <div class="row mb-3">
+          <div class="col-md-4">{% bootstrap_field form.start %}</div>
+          <div class="col-md-4">{% bootstrap_field form.end %}</div>
+          <div class="col-md-4">{% bootstrap_field form.publication_date %}</div>
+        </div>
+        <div class="row mb-3">
+          <div class="col-md-12">{% bootstrap_field form.global_notification %}</div>
+        </div>
+      </div>
+      {% if has_form_perms %}
+        {% trans 'Conference__submit' as button_text %}
+        <div class="card-footer">
+          {% bootstrap_button button_text button_type="submit" button_class="btn-primary float-end" %}
+        </div>
+      {% endif %}
+    </div>
+  </form>
+{% endblock content %}
diff --git a/src/backoffice/templates/backoffice/conferences/registration_edit.html b/src/backoffice/templates/backoffice/conferences/registration_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..1e43b6e6f72452936a676f288b16503f18e10140
--- /dev/null
+++ b/src/backoffice/templates/backoffice/conferences/registration_edit.html
@@ -0,0 +1,87 @@
+{% extends 'backoffice/base.html' %}
+{% load django_bootstrap5 %}
+{% load i18n %}
+{% load static %}
+{% block title %}
+  {% if form.create %}
+    {% trans 'create' %}
+  {% else %}
+    {{ form.instance.name }}
+  {% endif %}
+{% endblock title %}
+{% block scripts %}
+  <script src="{% static "backoffice/modal.js" %}"></script>
+  <script>
+  $(document).ready(() => {
+    showModal = registerModal()
+    publishConference = document.getElementById('publishConference');
+    if(publishConference){
+      document.getElementById('publishConference').addEventListener('click', (e) => {
+        e.preventDefault();
+        if (document.getElementById('id_is_public').value === "True"){
+          showModal(
+            () => {
+              form = document.getElementById('ConferenceForm');
+              form.action = publishConference.formAction
+              form.submit()
+            },
+            'warning',
+            '{% trans "Conference__recall__warning__header" %}',
+            '{% trans "Conference__recall__warning__text" %}',
+            '{% trans "Conference__recall__submit" %}')
+        } else {
+          showModal(
+            () => {
+              form = document.getElementById('ConferenceForm');
+              form.action = publishConference.formAction
+              form.submit()
+            },
+            'warning',
+            '{% trans "Conference__publish__warning__header" %}',
+            '{% trans "Conference__publish__warning__text" %}',
+            '{% trans "Conference__publish__submit" %}')
+        }
+      })
+    };
+  });
+  </script>
+{% endblock scripts %}
+{% block content %}
+  <form method="POST" enctype="multipart/form-data" id="ConferenceForm">
+    {% csrf_token %}
+    <div class="card border-default">
+      <div class="card-header bg-default">
+        {% if form.create %}
+          {% blocktrans %}create conference{% endblocktrans %}
+        {% else %}
+          {% blocktrans %}edit conference{% endblocktrans %}
+        {% endif %}
+      </div>
+      <div class="card-body">
+
+        {% if form.errors %}<div class="alert alert-danger">{{ form.errors }}</div>{% endif %}
+
+        <p class="fw-bold border-bottom mb-3">{% trans "Conference__edit-metadata" %}</p>
+        <div class="row mb-3">
+          <div class="col-md-4">{% bootstrap_field form.name %}</div>
+          <div class="col-md-4">{% bootstrap_field form.slug %}</div>
+          <div class="col-md-4">{% bootstrap_field form.publication_date %}</div>
+        </div>
+        <div class="row mb-3">
+          <div class="col-md-6">{% bootstrap_field form.registration_start %}</div>
+          <div class="col-md-6">{% bootstrap_field form.registration_deadline %}</div>
+        </div>
+        <div class="row mb-3">
+          <div class="col-md-12">{% bootstrap_field form.additional_fields_schema %}</div>
+        </div>
+
+      </div>
+      {% if has_form_perms %}
+        {% trans 'Conference__submit' as button_text %}
+        <div class="card-footer">
+          {% bootstrap_button button_text button_type="submit" button_class="btn-primary float-end" %}
+        </div>
+      {% endif %}
+    </div>
+  </form>
+{% endblock content %}
diff --git a/src/backoffice/templates/backoffice/conferenceselection.html b/src/backoffice/templates/backoffice/conferences/selection.html
similarity index 89%
rename from src/backoffice/templates/backoffice/conferenceselection.html
rename to src/backoffice/templates/backoffice/conferences/selection.html
index 9cad9c308c6742562bc43eea0263039b65fdb25b..7ded69a53c29e49c6f777e9303393c1a7e4039fe 100644
--- a/src/backoffice/templates/backoffice/conferenceselection.html
+++ b/src/backoffice/templates/backoffice/conferences/selection.html
@@ -7,10 +7,10 @@
         <div class="card-header">{% trans "Conferences__selection__header" %}</div>
         <div class="card-body">
           {% if conferences %}
-            <form action="{% url 'backoffice:conference_selection' %}" method="POST">
+            <form action="{% url 'backoffice:conferences' %}" method="POST">
               {% csrf_token %}
               <p>
-                {% trans Conferences__selection__help%}
+                {% trans Conferences__selection__help %}
               </p>
               <div class="mb-3">
                 <label class="form-label" for="conference">{% trans 'Conference' %}:</label>
diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py
index 6931b8b45b50914fa3098b95e62e79e1bb2a060a..cffa5382b5918a2114109e5e3d74822bc37bc509 100644
--- a/src/backoffice/urls.py
+++ b/src/backoffice/urls.py
@@ -1,6 +1,11 @@
 from django.urls import path, re_path
 from django.views.generic import RedirectView
 
+from backoffice.views.conferences import (
+    ConferencePublicationView,
+    ConferenceRegistrationView,
+    ConferenceSelectionView,
+)
 from backoffice.views.map import (
     FloorCreateView,
     FloorListView,
@@ -47,7 +52,9 @@ urlpatterns = [
     path('login', auth.LoginView.as_view(), name='login'),
     path('logout', auth.LogoutView.as_view(), name='logout'),
     path('auth_debug', auth.AuthDebugView.as_view()),
-    path('conferences', misc.ConferenceSelectionView.as_view(), name='conference_selection'),
+    path('conferences', ConferenceSelectionView.as_view(), name='conferences'),
+    path('conference/<uuid:pk>', ConferencePublicationView.as_view(), name='conference-publication'),
+    path('conference/<uuid:pk>/registration', ConferenceRegistrationView.as_view(), name='conference-registration'),
     path('wiki', wiki.WikiOverviewView.as_view(), name='wiki'),
     path('wiki/namespaces', wiki.NamespaceListView.as_view(), name='wiki-namespaces'),
     path('wiki/locks', wiki.LockListView.as_view(), name='wiki-locks'),
diff --git a/src/backoffice/views/conferences.py b/src/backoffice/views/conferences.py
new file mode 100644
index 0000000000000000000000000000000000000000..66515ce995aae3295dbf5504333b2989b32992b9
--- /dev/null
+++ b/src/backoffice/views/conferences.py
@@ -0,0 +1,198 @@
+import logging
+from typing import Any
+
+from django.contrib import messages
+from django.core.exceptions import PermissionDenied
+from django.forms.forms import BaseForm
+from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
+from django.shortcuts import redirect
+from django.urls import reverse
+from django.utils.translation import gettext_lazy as _
+from django.views.generic.edit import FormView, UpdateView
+
+from core.forms import ConferencePublicationForm, ConferenceRegistrationForm
+from core.models import Conference, ConferenceMember
+
+from backoffice.forms import ConferenceSelectionForm
+from backoffice.views.mixins import ConferenceRequiredMixin, LoginRequiredMixin
+
+logger = logging.getLogger(__name__)
+
+
+class ConferenceSelectionView(LoginRequiredMixin, FormView):
+    """
+    A class-based view that will let you select the current :model:`core.Conference` for you session.
+
+    It will also be used if no conference is available and show an error message to the user.
+
+    **Context:**
+
+    ``conferences``
+        A list of all available :model:`core.Conference` for the current user.
+
+    **Template:**
+
+    :template:`backoffice/conferences/selection.html`
+
+    """
+
+    form_class = ConferenceSelectionForm
+    template_name = 'backoffice/conferences/selection.html'
+    active_page = 'conferences'
+
+    def form_valid(self, form: ConferenceSelectionForm):
+        """Sets the selected conference for the session if the form is valid.
+
+        Args:
+            form (ConferenceForm): A form containing the selected conference
+
+        Returns:
+            Response: A redirection to the backoffice index
+        """
+        conf_slug = form.cleaned_data['conference_slug']
+        conference = Conference.objects.accessible_by_user(self.request.user).get(slug=conf_slug)
+        self.request.session['conference'] = conference.slug
+        return redirect('backoffice:index')
+
+    def get_context_data(self, *args, **kwargs):
+        return {
+            **super().get_context_data(*args, **kwargs),
+            'conferences': Conference.objects.accessible_by_user(self.request.user),
+            'active_page': self.active_page,
+        }
+
+
+class ConferenceFormMixin(ConferenceRequiredMixin, FormView):
+    object: Conference | None
+    model = Conference
+    context_object_name = 'conference'
+    permission_required = ['core.conference_admin', 'core.assembly_registration_admin']
+    require_all_permissions = False
+    require_staff = True
+    form_permissions_required = []
+    sidebar_caption = _('nav_conference')
+    active_page: str
+
+    def get_context_data(self, *args, **kwargs):
+        return {
+            **super().get_context_data(*args, **kwargs),
+            'has_form_perms': self.request.user.has_conference_staff_permission(self.conference, *self.form_permissions_required),
+            'active_page': self.active_page,
+            'sidebar': {
+                'title': self.sidebar_caption,
+                'items': [
+                    {
+                        'caption': _('Conference__Publication'),
+                        'link': reverse(
+                            'backoffice:conference-publication',
+                            kwargs={'pk': self.conference.pk},
+                        ),
+                    },
+                    {
+                        'caption': _('Conference__Registration'),
+                        'link': reverse(
+                            'backoffice:conference-registration',
+                            kwargs={'pk': self.conference.pk},
+                        ),
+                    },
+                ],
+            },
+        }
+
+    def get_form(self, form_class: type | None = None) -> ConferencePublicationForm | BaseForm:
+        form = super().get_form(form_class)
+        member = ConferenceMember.objects.filter(user=self.request.user, conference=self.object).first()
+        if member and member.has_perms(*self.form_permissions_required, require_staff=self.require_staff):
+            return form
+        for field in form.fields:
+            form.fields[field].disabled = True
+        return form
+
+    def post(self, request: HttpRequest, *args: str, **kwargs: Any) -> HttpResponse:
+        if not self.request.user.has_conference_staff_permission(self.conference, *self.form_permissions_required):
+            raise PermissionDenied
+        return super().post(request, *args, **kwargs)
+
+
+class ConferencePublicationView(ConferenceFormMixin, UpdateView):
+    """
+    An UpdateView to change the publication settings of the current :model:`core.conference`.
+    """
+
+    form_class = ConferencePublicationForm
+    template_name = 'backoffice/conferences/publication_edit.html'
+    active_page = 'conference'
+    form_permissions_required = ['core.conference_admin']
+
+    def get_form_kwargs(self, *args, **kwargs) -> dict[str, Any]:
+        publish = False
+        if self.object:
+            publish = (not self.object.is_public and self.request.GET.get('publish') == 'true') or (
+                self.object.is_public and self.request.GET.get('recall') == 'true'
+            )
+        return {
+            **super().get_form_kwargs(*args, **kwargs),
+            'publish': publish,
+        }
+
+    def form_valid(self, form: ConferencePublicationForm):
+        # Try to safe the form before creating logs and messages
+        self.object = form.save()
+        logger.info(
+            'changed publication info of "%(conference)s" by %(user)s',
+            {
+                'conference': form.instance,
+                'user': self.request.user,
+            },
+        )
+
+        if form.publish and self.object.is_public:
+            messages.success(self.request, _('Conference__publish__success'))
+        elif form.publish and not self.object.is_public:
+            messages.success(self.request, _('Conference__recall__success'))
+        elif form.create:
+            messages.success(self.request, _('Conference__create__success'))
+        else:
+            messages.success(self.request, _('Conference__update__success'))
+
+        return HttpResponseRedirect(self.get_success_url())
+
+    def form_invalid(self, form: ConferencePublicationForm):
+        if form.publish:
+            form.instance.is_public = False
+            messages.error(self.request, _('Conference__publish__failed'))
+        else:
+            messages.error(self.request, _('Conference__form__invalid'))
+
+        return super().form_invalid(form)
+
+    def get_success_url(self):
+        return reverse('backoffice:conference-publication', kwargs={'pk': self.object.pk})
+
+
+class ConferenceRegistrationView(ConferenceFormMixin, UpdateView):
+    """
+    An UpdateView to change to current :model:`core.conference` settings.
+    """
+
+    template_name = 'backoffice/conferences/registration_edit.html'
+    form_class = ConferenceRegistrationForm
+    active_page = 'conference'
+    form_permissions_required = ['core.assembly_registration_admin']
+
+    def form_valid(self, form: ConferencePublicationForm):
+        # Try to safe the form before creating logs and messages
+        self.object = form.save()
+        logger.info(
+            'changed publication info of "%(conference)s" by %(user)s',
+            {
+                'conference': form.instance,
+                'user': self.request.user,
+            },
+        )
+        messages.success(self.request, _('Conference__registration_update__success'))
+
+        return HttpResponseRedirect(self.get_success_url())
+
+    def get_success_url(self):
+        return reverse('backoffice:conference-registration', kwargs={'pk': self.object.pk})
diff --git a/src/backoffice/views/misc.py b/src/backoffice/views/misc.py
index 0728cf71834a9a4398eb0b6cf63f549954c50a85..5ca163188ee66c104287513eea2a3ef95f8b0a8d 100644
--- a/src/backoffice/views/misc.py
+++ b/src/backoffice/views/misc.py
@@ -1,28 +1,9 @@
-from django.shortcuts import redirect, render
+from django.shortcuts import render
 from django.views.generic import View
-from django.views.generic.edit import FormView
 
-from core.models import Assembly, Conference
+from core.models.assemblies import Assembly
 
-from backoffice.forms import ConferenceForm
-from backoffice.views.mixins import ConferenceLoginRequiredMixin, LoginRequiredMixin
-
-
-class ConferenceSelectionView(LoginRequiredMixin, FormView):
-    form_class = ConferenceForm
-    template_name = 'backoffice/conferenceselection.html'
-
-    def form_valid(self, form):
-        conf_slug = form.cleaned_data['conference_slug']
-        conference = Conference.objects.accessible_by_user(self.request.user).get(slug=conf_slug)
-        self.request.session['conference'] = conference.slug
-        return redirect('backoffice:index')
-
-    def get_context_data(self, *args, **kwargs):
-        ctx = super().get_context_data(*args, **kwargs)
-        ctx['conferences'] = Conference.objects.accessible_by_user(self.request.user)
-        ctx['active_page'] = 'conference_selection'
-        return ctx
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class IndexView(ConferenceLoginRequiredMixin, View):
@@ -30,7 +11,7 @@ class IndexView(ConferenceLoginRequiredMixin, View):
 
     def get(self, *args, **kwargs):
         if self.request.user.is_authenticated:
-            myassemblies = list(Assembly.objects.associated_to_user(conference=self.conference, user=self.request.user))
+            myassemblies = list(Assembly.objects.associated_with_user(conference=self.conference, user=self.request.user))
 
             # remove stored backlink for assembly pages from the session if it is set, so the backlink will go to the overview, which is the default
             self.request.session.pop('assembly_back', None)
diff --git a/src/backoffice/views/mixins.py b/src/backoffice/views/mixins.py
index fe34962ff8f11a8c3c4b7cb0d1c9f8cc5850c29b..0b5e6867b95cc05e5165ec11ad1b00bb2cd416bf 100644
--- a/src/backoffice/views/mixins.py
+++ b/src/backoffice/views/mixins.py
@@ -80,7 +80,7 @@ class ConferenceRequiredMixin(PermissionRequiredMixin):
 
     def dispatch(self, request, *args, **kwargs):
         if self.require_conference and self.conference is None:
-            return redirect('backoffice:conference_selection')
+            return redirect('backoffice:conferences')
         if not self.has_permission():
             raise PermissionDenied('Insufficient privileges.')
         return super().dispatch(request, *args, **kwargs)
@@ -111,6 +111,8 @@ class ConferenceRequiredMixin(PermissionRequiredMixin):
                     'has_channel': self.is_channel_team,
                     'has_pages': self.conferencemember.has_perms('core.static_pages', require_staff=True),
                     'has_map': self.conferencemember.has_perms('core.map_edit', require_staff=True),
+                    'has_assembly_registration_admin': self.conferencemember.has_perms('core.assembly_registration_admin', require_staff=True),
+                    'has_conference_admin': self.conferencemember.has_perms('core.conference_admin', require_staff=True),
                     'has_moderation': self.conferencemember.has_perms('core.moderation', require_staff=True),
                     'has_schedules': self.conferencemember.has_perms('core.scheduleadmin', require_staff=True),
                     'has_workadventure': settings.INTEGRATIONS_WORKADVENTURE
@@ -124,6 +126,8 @@ class ConferenceRequiredMixin(PermissionRequiredMixin):
                     'has_channel': False,
                     'has_pages': False,
                     'has_map': False,
+                    'has_assembly_registration_admin': False,
+                    'has_conference_admin': False,
                     'has_moderation': False,
                     'has_schedules': False,
                     'has_workadventure': False,
diff --git a/src/core/fixtures/bootstrap_auth_groups.json b/src/core/fixtures/bootstrap_auth_groups.json
index 364f79683d75958393f5fe0d62058a51167b8396..bc1cb07757307f89ee5d61bfb430cb74cc1add67 100644
--- a/src/core/fixtures/bootstrap_auth_groups.json
+++ b/src/core/fixtures/bootstrap_auth_groups.json
@@ -12,6 +12,19 @@
             ]
         }
     },
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "Registration Admin",
+            "permissions": [
+                [
+                    "assembly_registration_admin",
+                    "core",
+                    "conferencemember"
+                ]
+            ]
+        }
+    },
     {
         "model": "auth.group",
         "fields": {
@@ -92,6 +105,11 @@
                     "static_pages",
                     "core",
                     "conferencemember"
+                ],
+                [
+                    "conference_admin",
+                    "core",
+                    "conferencemember"
                 ]
             ]
         }
diff --git a/src/core/forms.py b/src/core/forms.py
index 86a57d08fd577dec00ac0f9b1a3bafcba8ac42d7..dbcdef83e49c8ab6afed247170c543693a620a4d 100644
--- a/src/core/forms.py
+++ b/src/core/forms.py
@@ -13,7 +13,7 @@ from django.contrib.sites.shortcuts import get_current_site
 from django.core.exceptions import ValidationError
 from django.core.mail import EmailMultiAlternatives
 from django.db.models import Q
-from django.forms import BaseModelFormSet, CharField, ChoiceField, EmailField, EmailInput, ModelForm
+from django.forms import BaseModelFormSet, CharField, ChoiceField, DateTimeInput, EmailField, EmailInput, ModelForm
 from django.template import loader
 from django.utils.encoding import force_bytes
 from django.utils.http import urlsafe_base64_encode
@@ -21,6 +21,7 @@ from django.utils.translation import gettext_lazy as _
 
 from core.base_forms import TranslatedFieldsForm
 from core.models import Assembly, ConferenceMember, Link, PlatformUser, Project, UserCommunicationChannel
+from core.models.conference import Conference
 from core.models.tags import clean_tags
 from core.tokens import channel_activation_token
 
@@ -243,6 +244,76 @@ class LinkFormSet(BaseModelFormSet):
             form.set_linked_object(linked_object)
 
 
+class ConferencePublicationForm(TranslatedFieldsForm):
+    class Meta:
+        model = Conference
+        fields = [
+            'name',
+            'slug',
+            'start',
+            'end',
+            'publication_date',
+            'timezone',
+            'global_notification',
+            'is_public',
+        ]
+
+        widgets = {
+            'start': DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'),
+            'end': DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'),
+            'publication_date': DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'),
+        }
+
+    def __init__(
+        self,
+        *args,
+        instance: Conference | None = None,
+        publish: bool = False,
+        **kwargs,
+    ):
+        self.publish = publish
+        self.create = instance is None
+        super().__init__(*args, instance=instance, **kwargs)
+        if not self.create:
+            self.fields['name'].disabled = True
+            self.fields['slug'].disabled = True
+
+    def clean(self) -> dict[str, Any]:
+        if self.instance.is_public != self.cleaned_data['is_public']:
+            raise ValidationError(_('Conference__is_public__unchangeable'))
+        self.cleaned_data['is_public'] = not self.instance.is_public if self.publish else self.instance.is_public
+        return super().clean()
+
+
+class ConferenceRegistrationForm(TranslatedFieldsForm):
+    class Meta:
+        model = Conference
+        fields = [
+            'name',
+            'slug',
+            'publication_date',
+            'registration_start',
+            'registration_deadline',
+            'additional_fields_schema',
+        ]
+
+        widgets = {
+            'publication_date': DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'),
+            'registration_start': DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'),
+            'registration_deadline': DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'),
+        }
+
+    def __init__(
+        self,
+        *args,
+        instance: Conference | None = None,
+        **kwargs,
+    ):
+        super().__init__(*args, instance=instance, **kwargs)
+        self.fields['name'].disabled = True
+        self.fields['slug'].disabled = True
+
+
 class ProjectForm(TranslatedFieldsForm):
     class Meta:
         model = Project
diff --git a/src/core/locale/de/LC_MESSAGES/django.po b/src/core/locale/de/LC_MESSAGES/django.po
index f8d30d14df38b2a2cc43cec052fb73370a02683f..e6c5b80d802fa77913b6b866aa787794ff0386cf 100644
--- a/src/core/locale/de/LC_MESSAGES/django.po
+++ b/src/core/locale/de/LC_MESSAGES/django.po
@@ -137,6 +137,9 @@ msgstr "Zu viele Request (Rate-Limited), bitte einen Moment warten!"
 msgid "Registration__username__nounderscore"
 msgstr "Der Benutzername darf nicht mit einem Unterstrich beginnen."
 
+msgid "Conference__is_public__unchangeable"
+msgstr "Der Konferenz Veröffentlichungsstatus kann nur mittels des Veröffentlichen Buttons durchgeführt werden."
+
 msgid "Tags"
 msgstr ""
 
@@ -628,9 +631,15 @@ msgstr "Wenn du eine neue Badge akzeptierst wird sie standardmäßig mit dieser
 msgid "ConferenceMember__default_badge_visibility"
 msgstr "Sichtbarkeit neuer Badges"
 
+msgid "ConferenceMember__permission-confernece_admin"
+msgstr "Konferenz-Admin: Kann die Veröffentlichungszeitpunkte der Konferenz verwalten"
+
 msgid "ConferenceMember__permission-assembly_team"
 msgstr "Assembly-Team: alle Assemblies verwaltbar, auch noch nicht fertig angelegte und abgelehnte sind sichtbar"
 
+msgid "ConferenceMember__permission-assembly_registration_admin"
+msgstr "Registrierungs-Admin: Verwalten der Registrierungsinformationen für Assemblies"
+
 msgid "ConferenceMember__permission-channel_team"
 msgstr "Channel-Team: alle Assemblies verwaltbar, auch noch nicht fertig angelegte und abgelehnte sind sichtbar"
 
diff --git a/src/core/locale/en/LC_MESSAGES/django.po b/src/core/locale/en/LC_MESSAGES/django.po
index dc6c5f67a6bffb415ae8c584ee2124dd4578726a..26eb8f1f6919652af3f08e088eee352ad55baed0 100644
--- a/src/core/locale/en/LC_MESSAGES/django.po
+++ b/src/core/locale/en/LC_MESSAGES/django.po
@@ -137,6 +137,9 @@ msgstr "Too many requests (Rate-Limited), please wait a moment!"
 msgid "Registration__username__nounderscore"
 msgstr "The username must not begin with an underscore."
 
+msgid "Conference__is_public__unchangeable"
+msgstr "The conference publication status can only be changed using the publish button."
+
 msgid "Tags"
 msgstr ""
 
@@ -628,9 +631,15 @@ msgstr " When you accept a new badge, it will be displayed with this visibility
 msgid "ConferenceMember__default_badge_visibility"
 msgstr "visibility of new badges"
 
+msgid "ConferenceMember__permission-confernece_admin"
+msgstr "Conference admin: can manage the conference's publication times"
+
 msgid "ConferenceMember__permission-assembly_team"
 msgstr "assemblies team: manage all assemblies, see also incomplete and rejected registrations"
 
+msgid "ConferenceMember__permission-assembly_registration_admin"
+msgstr "Registration-Admin: Manage registration information for assemblies"
+
 msgid "ConferenceMember__permission-channel_team"
 msgstr "channel team: manage all assemblies, see also incomplete and rejected registrations"
 
diff --git a/src/core/migrations/0152_alter_conferencemember_options.py b/src/core/migrations/0152_alter_conferencemember_options.py
new file mode 100644
index 0000000000000000000000000000000000000000..e616272056e1232f0b25f81547a7915e5a9fccea
--- /dev/null
+++ b/src/core/migrations/0152_alter_conferencemember_options.py
@@ -0,0 +1,35 @@
+# Generated by Django 5.1.2 on 2024-10-27 00:54
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("core", "0151_conference_publication_date"),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name="conferencemember",
+            options={
+                "permissions": [
+                    (
+                        "conference_admin",
+                        "ConferenceMember__permission-confernece_admin",
+                    ),
+                    ("assembly_team", "ConferenceMember__permission-assembly_team"),
+                    ("channel_team", "ConferenceMember__permission-channel_team"),
+                    ("static_pages", "ConferenceMember__permission-static_pages"),
+                    ("map_edit", "ConferenceMember__permission-map_edit"),
+                    ("moderation", "Orga: Moderation"),
+                    ("voucher_admin", "ConferenceMember__permission-voucher_admin"),
+                    ("scheduleadmin", "ConferenceMember__permission-scheduleadmin"),
+                    (
+                        "workadventure_admin",
+                        "ConferenceMember__permission-workadventure_admin",
+                    ),
+                ]
+            },
+        ),
+    ]
diff --git a/src/core/migrations/0153_alter_conferencemember_options.py b/src/core/migrations/0153_alter_conferencemember_options.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce1ce96d856de70f82574daab462446b00243018
--- /dev/null
+++ b/src/core/migrations/0153_alter_conferencemember_options.py
@@ -0,0 +1,39 @@
+# Generated by Django 5.1.2 on 2024-10-27 13:10
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("core", "0152_alter_conferencemember_options"),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name="conferencemember",
+            options={
+                "permissions": [
+                    (
+                        "conference_admin",
+                        "ConferenceMember__permission-confernece_admin",
+                    ),
+                    ("assembly_team", "ConferenceMember__permission-assembly_team"),
+                    (
+                        "assembly_registration_admin",
+                        "ConferenceMember__permission-assembly_registration_admin",
+                    ),
+                    ("channel_team", "ConferenceMember__permission-channel_team"),
+                    ("static_pages", "ConferenceMember__permission-static_pages"),
+                    ("map_edit", "ConferenceMember__permission-map_edit"),
+                    ("moderation", "Orga: Moderation"),
+                    ("voucher_admin", "ConferenceMember__permission-voucher_admin"),
+                    ("scheduleadmin", "ConferenceMember__permission-scheduleadmin"),
+                    (
+                        "workadventure_admin",
+                        "ConferenceMember__permission-workadventure_admin",
+                    ),
+                ]
+            },
+        ),
+    ]
diff --git a/src/core/models/conference.py b/src/core/models/conference.py
index e06c906f0036790fb484cfe13d44df785184c37f..501d6ecb1afcf23a470f24af417fca60b924c832 100644
--- a/src/core/models/conference.py
+++ b/src/core/models/conference.py
@@ -78,8 +78,12 @@ class ConferenceMember(models.Model):
 
     class Meta:
         permissions = [
+            ('conference_admin', _('ConferenceMember__permission-confernece_admin')),
+            # Change conference settings (e.g., dates, ), update venue json.
             ('assembly_team', _('ConferenceMember__permission-assembly_team')),
             # See all assemblies, not only the accepted ones.
+            ('assembly_registration_admin', _('ConferenceMember__permission-assembly_registration_admin')),
+            # See all assemblies, not only the accepted ones.
             ('channel_team', _('ConferenceMember__permission-channel_team')),
             # Channelteam, Assemblyteam for Channel-Type Assemblies (Assemblies that provide their own content)
             ('static_pages', _('ConferenceMember__permission-static_pages')),