diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index e7b741e41e60bc878f460e32b1c9b336997d7c21..7056bc0866de0e44b466a08c1eccf0f0262d0f44 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,15 @@
 Changelog
 =========
 
+`1.0a2`_
+--------
+
+New features
+~~~~~~~~~~~~
+
+* Add list of all future substitutions
+
+
 `1.0a2`_
 --------
 
@@ -37,3 +46,4 @@ Minor changes
 
 _`1.0a1`: https://edugit.org/Teckids/BiscuIT/BiscuIT-App-Chronos/-/tags/1.0a1
 _`1.0a2`: https://edugit.org/Teckids/BiscuIT/BiscuIT-App-Chronos/-/tags/1.0a2
+_`1.0a3`: https://edugit.org/Teckids/BiscuIT/BiscuIT-App-Chronos/-/tags/1.0a3
diff --git a/biscuit/apps/chronos/menus.py b/biscuit/apps/chronos/menus.py
index 109bbb85d9fe5d431d5ca2ebf40d6a85dcacae47..11851fe6cc21a3c84404b76b99a3663745486cd5 100644
--- a/biscuit/apps/chronos/menus.py
+++ b/biscuit/apps/chronos/menus.py
@@ -17,6 +17,11 @@ MENUS = {
                     'name': _('Daily lessons'),
                     'url': 'lessons_day',
                     'validators': ['menu_generator.validators.is_authenticated']
+                },
+                {
+                    'name': _('Substitutions'),
+                    'url': 'substitutions',
+                    'validators': ['menu_generator.validators.is_authenticated']
                 }
             ]
         }
diff --git a/biscuit/apps/chronos/tables.py b/biscuit/apps/chronos/tables.py
index ad0408e0c762d41ab5b771640eece34a738a48c4..f05d6aa13cbae38d939b7b038a62132ab571a599 100644
--- a/biscuit/apps/chronos/tables.py
+++ b/biscuit/apps/chronos/tables.py
@@ -31,3 +31,15 @@ class LessonsTable(tables.Table):
     room = tables.Column(accessor='room')
     edit_substitution = tables.LinkColumn(
         'edit_substitution', args=[A('id'), A('_week')], text=_('Substitution'))
+
+
+class SubstitutionsTable(tables.Table):
+    class Meta:
+        attrs = {'class': 'table table-striped table-bordered table-hover table-responsive-xl'}
+
+    lesson_period = tables.Column(verbose_name=_('Lesson'))
+    lesson__groups = tables.Column(accessor='lesson_period.lesson.group_names', verbose_name=_('Groups'))
+    lesson__teachers = tables.Column(accessor='lesson_period.get_teacher_names', verbose_name=_('Teachers'))
+    lesson__subject = tables.Column(accessor='subject')
+    room = tables.Column(accessor='room')
+    cancelled = tables.BooleanColumn(accessor='cancelled', verbose_name=_('Cancelled'))
diff --git a/biscuit/apps/chronos/templates/chronos/substitutions.html b/biscuit/apps/chronos/templates/chronos/substitutions.html
new file mode 100644
index 0000000000000000000000000000000000000000..3ab767bbf5586927e522904d0d97a176466bb1c7
--- /dev/null
+++ b/biscuit/apps/chronos/templates/chronos/substitutions.html
@@ -0,0 +1,11 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/turnable.html" %}
+{% load bootstrap4 i18n font_awesome %}
+{% load render_table from django_tables2 %}
+
+{% block bootstrap4_title %}{% blocktrans %}Substitutions{% endblocktrans %} - {{ block.super }}{% endblock %}
+
+{% block current_content %}
+  {% render_table substitutions_table %}
+{% endblock %}
diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py
index 2972068e96db8a2f5f8c3de7e5870ac819bb55d8..f567ab33cefb5996f357ba1d768a63b8071e3d1c 100644
--- a/biscuit/apps/chronos/urls.py
+++ b/biscuit/apps/chronos/urls.py
@@ -9,5 +9,7 @@ urlpatterns = [
     path('lessons', views.lessons_day, name='lessons_day'),
     path('lessons/<when>', views.lessons_day, name='lessons_day_by_date'),
     path('lessons/<int:id_>/<int:week>/substition', views.edit_substitution, name='edit_substitution'),
-    path('lessons/<int:id_>/<int:week>/substition/delete', views.delete_substitution, name='delete_substitution')
+    path('lessons/<int:id_>/<int:week>/substition/delete', views.delete_substitution, name='delete_substitution'),
+    path('substitutions', views.substitutions, name='substitutions'),
+    path('substitutions/<int:year>/<int:week>', views.substitutions, name='substitutions_by_week')
 ]
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index 084e65035d1487d0e1a20f040f043e2deb90568b..f388891463742628250e87889d6c822c35a864f5 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -17,7 +17,7 @@ from biscuit.core.util import messages
 from .forms import SelectForm, LessonSubstitutionForm
 from .models import LessonPeriod, TimePeriod, LessonSubstitution
 from .util import CalendarWeek
-from .tables import LessonsTable
+from .tables import LessonsTable, SubstitutionsTable
 
 
 @login_required
@@ -160,3 +160,27 @@ def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpRespon
 
     messages.success(request, _('The substitution has been deleted.'))
     return redirect('lessons_day_by_date', when=wanted_week[lesson_period.period.weekday - 1].strftime('%Y-%m-%d'))
+
+
+def substitutions(request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None) -> HttpResponse:
+    context = {}
+
+    if week:
+        wanted_week = CalendarWeek(year=year, week=week)
+    else:
+        wanted_week = CalendarWeek()
+
+    substitutions = LessonSubstitution.objects.filter(week=wanted_week.week)
+
+    # Prepare table
+    substitutions_table = SubstitutionsTable(substitutions)
+    RequestConfig(request).configure(substitutions_table)
+
+    context['current_head'] = str(wanted_week)
+    context['substitutions_table'] = substitutions_table
+    week_prev = wanted_week - 1
+    week_next = wanted_week + 1
+    context['url_prev'] = '%s' % (reverse('substitutions_by_week', args=[week_prev.year, week_prev.week]))
+    context['url_next'] = '%s' % (reverse('substitutions_by_week', args=[week_next.year, week_next.week]))
+
+    return render(request, 'chronos/substitutions.html', context)