diff --git a/src/backoffice/forms.py b/src/backoffice/forms.py
index 5d92cb41e792108aac1858d17f69ed7bc79ec3ea..43b5f424b4bef846c68a889ddb3587f0a8fbada1 100644
--- a/src/backoffice/forms.py
+++ b/src/backoffice/forms.py
@@ -369,3 +369,6 @@ class StaticPageForm(forms.Form):
 
 class AssignBadgeForm(forms.Form):
     nickname = forms.CharField()
+
+class AssignRoleForm(forms.Form):
+    nickname = forms.CharField()
\ No newline at end of file
diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py
index 3e9495d1c85c39081aac17c3ade8f314403cdde2..3100c50fa88e7f3afb1e8f27de7fa2e4c81e7347 100644
--- a/src/backoffice/urls.py
+++ b/src/backoffice/urls.py
@@ -62,11 +62,15 @@ urlpatterns = [
 
     path('assembly/<uuid:assembly>/new_event', events.AssemblyCreateEventView.as_view(), name='assembly-create-event'),
     path('assembly/<uuid:assembly>/events', events.AssemblyEventsView.as_view(), name='assembly-events'),
+    path('assembly/<uuid:assembly>/e/<uuid:pk>/', events.AssemblyEventView.as_view(), name='assembly-event'),
+    path('assembly/<uuid:assembly>/e/<uuid:pk>/remove', events.AssemblyRemoveEventView.as_view(), name='assembly-event-remove'),
+    path('assembly/<uuid:assembly>/e/<uuid:pk>/assign/speaker', events.AssignRoleView.as_view(), name='assembly-event-assign-speaker'),
+
     path('assembly/<uuid:assembly>/new_room', assemblies.CreateRoomView.as_view(), name='assembly-create-room'),
     path('assembly/<uuid:assembly>/new_project', assemblies.CreateProjectView.as_view(), name='assembly-create-project'),
+    path('assembly/<uuid:assembly>/new_project', assemblies.CreateProjectView.as_view(), name='assembly-create-project'),
+
 
-    path('assembly/<uuid:assembly>/e/<uuid:pk>/', events.AssemblyEventView.as_view(), name='assembly-event'),
-    path('assembly/<uuid:assembly>/e/<uuid:pk>/remove', events.AssemblyRemoveEventView.as_view(), name='assembly-event-remove'),
     path('assembly/<uuid:assembly>/r/<uuid:pk>/', assemblies.AssemblyRoomView.as_view(), name='assembly-room'),
     path('assembly/<uuid:assembly>/r/<uuid:room>/new_link', assemblies.CreateRoomLinkView.as_view(), name='roomlink-create'),
     path('assembly/<uuid:assembly>/r/<uuid:room>/remove_link', assemblies.RemoveRoomLinkView.as_view(), name='roomlink-remove'),
diff --git a/src/backoffice/views/events.py b/src/backoffice/views/events.py
index 807e0659b5590d658cf7bf56f49b374aeab636c0..a994b4c407103ac330a8abed976b889045f3d887 100644
--- a/src/backoffice/views/events.py
+++ b/src/backoffice/views/events.py
@@ -2,14 +2,16 @@ import logging
 
 from django.contrib import messages
 from django.views.generic import ListView
-from django.views.generic.edit import CreateView, DeleteView, UpdateView
+from django.http import HttpResponse
+from django.views.generic.edit import CreateView, DeleteView, UpdateView, FormView
 from django.urls import reverse
 from django.utils.translation import gettext_lazy as _
-
-from core.models.events import Event
+from django.shortcuts import get_object_or_404, redirect
+from core.models.events import Event, EventParticipant
 from core.models.rooms import Room
+from core.models.users import PlatformUser
 
-from ..forms import CreateAssemblyEventForm
+from ..forms import CreateAssemblyEventForm, AssignRoleForm
 from .mixins import AssemblyMixin
 
 
@@ -32,6 +34,11 @@ class AssemblyEventView(AssemblyMixin, UpdateView):
 
     assembly_url_param = 'assembly'
 
+    def get_context_data(self, *args, **kwargs):
+        ctx = super().get_context_data(*args, **kwargs)
+        ctx['assign_form'] = AssignRoleForm()
+        return ctx
+
     def get_form(self, *args, **kwargs):
         form = super().get_form(*args, **kwargs)
         form.fields['room'].queryset = self.assembly.rooms.exclude(room_type=Room.RoomType.PROJECT)
@@ -106,3 +113,33 @@ class AssemblyCreateEventView(AssemblyMixin, CreateView):
 
     def get_success_url(self):
         return reverse('backoffice:assembly-event', kwargs={'assembly': self.assembly.id, 'pk': self.object.id})
+
+
+class AssignRoleView(AssemblyMixin, FormView):
+    form_class = AssignRoleForm
+
+    def get_context_data(self, *args, **kwargs):
+        ctx = super().get_context_data(*args, **kwargs)
+        ctx['assign_form'] = AssignRoleForm()
+        return ctx
+
+    def form_valid(self, form, **kwargs):
+        if not self.request.user.has_conference_staffpermission(self.conference, 'core.view_platformuser', 'core.block_platformuser'):
+            return HttpResponse('Unauthorized', status=401)
+        role = self.kwargs['role']
+        event_id = self.kwargs['pk']
+        if role not in EventParticipant.Role:
+            return HttpResponse('Unauthorized', status=400)
+
+        data = form.cleaned_data
+        try:
+            user = get_object_or_404(PlatformUser, is_active=True, username=data['nickname'])
+            event = get_object_or_404(Event, id=event_id)
+            participant = EventParticipant(role=role, event=event, participant=user)
+            messages.success(self.request, _('Event__Role-award-to') + str(user))
+            logger.info(f'assigned role { role } to { user } by { self.request.user } for { event }')
+
+            return redirect('backoffice:assembly-events', assembly=self.assembly.pk, pk=self.event_id)
+        except PlatformUser.DoesNotExist:
+            messages.error(self.request, _('404__User Not Found: ') + data['nickname'])
+            return redirect('backoffice:assembly-events', assembly=self.assembly.pk, pk=self.event_id)
\ No newline at end of file