diff --git a/biscuit/apps/chronos/forms.py b/biscuit/apps/chronos/forms.py
index 72c97eb2badfada6a5e2a84224efd7939bddbfba..2ad9b84de1c4a5ea1499dd31ea257dafd124726d 100644
--- a/biscuit/apps/chronos/forms.py
+++ b/biscuit/apps/chronos/forms.py
@@ -18,7 +18,12 @@ class SelectForm(forms.Form):
         queryset=Room.objects.annotate(lessons_count=Count('lesson_periods')).filter(lessons_count__gt=0),
         label=_('Room'), required=False)
 
-class LessonSubstitution(forms.ModelForm):
+class LessonSubstitutionForm(forms.ModelForm):
     class Meta:
         model = LessonSubstitution
         fields = ['week', 'lesson_period', 'subject', 'teachers', 'room']
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.fields['teachers'].queryset = Person.objects.all()
+        self.fields['room'].queryset = Person.objects.all()
diff --git a/biscuit/apps/chronos/templates/chronos/edit_substitution.html b/biscuit/apps/chronos/templates/chronos/edit_substitution.html
new file mode 100644
index 0000000000000000000000000000000000000000..f6c8dbd0079af20aea62129d65beb24db8f40f47
--- /dev/null
+++ b/biscuit/apps/chronos/templates/chronos/edit_substitution.html
@@ -0,0 +1,14 @@
+{% extends "core/base.html" %}
+{% load bootstrap4 i18n %}
+
+{% block page_title %}{% blocktrans %}Edit substitution{% endblocktrans %}{% endblock %}
+
+{% block content %}
+
+ <form method="post">
+  {% csrf_token %}
+  {% bootstrap_form edit_substitution_form %}
+  <input type="submit" value="Edit" />
+ </form>
+
+{% endblock %}
diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py
index 4161fb3c33f52407f1a653635749feaf16976228..7a414cbffaaffff2e0cf0fc4990041e5b770cfbe 100644
--- a/biscuit/apps/chronos/urls.py
+++ b/biscuit/apps/chronos/urls.py
@@ -7,4 +7,5 @@ urlpatterns = [
     path('timetable', views.timetable, name='timetable'),
     path('lessons', views.lessons_day, name='lessons_day'),
     path('lessons/<when>', views.lessons_day, name='lessons_day_by_date')
+    path('substitutions/<id>/edit', views.edit_substitution, name='edit_substitution')
 ]
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index 7aa1e35944ce4c95f579c18c6b630b0294269458..f0579acf729cadcecd2b60fe14b268b14b1463d5 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -13,7 +13,7 @@ from django_tables2 import RequestConfig
 from biscuit.core.decorators import admin_required
 from biscuit.core.models import Group, Person
 
-from .forms import SelectForm
+from .forms import SelectForm, LessonSubstitutionForm
 from .models import LessonPeriod, TimePeriod, Room
 from .util import current_week, week_weekday_from_date
 from .tables import LessonsTable
@@ -113,3 +113,24 @@ def lessons_day(request: HttpRequest, when: Optional[str] = None) -> HttpRespons
     context['lesson_periods'] = lesson_periods
 
     return render(request, 'chronos/lessons_day.html', context)
+
+@admin_required
+def edit_substitution(request: HttpRequest, id_: int) -> HttpResponse:
+    context = {}
+
+    substitution = get_object_or_404(Substitution, id=id_)
+
+    edit_substitution_form = LessonSubstitutionForm(request.POST or None, instance=substitution)
+
+    context['substitution'] = substitution
+
+    if request.method == 'POST':
+        if edit_substitution_form.is_valid():
+            edit_substitution_form.save(commit=True)
+
+            messages.success(request, _('The substitution has been saved.'))
+            return redirect('edit_substitution_by_id', id_=substitution.id)
+
+    context['edit_substitution_form'] = edit_substitution_form
+
+    return render(request, 'chronos/edit_substitution.html', context)