diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py
index bd8bb51350a971fad85c4205e4892f93fdac87e6..0556b89a5c5a8ca2b6dcedb254054c3bac2ea811 100644
--- a/biscuit/apps/chronos/models.py
+++ b/biscuit/apps/chronos/models.py
@@ -9,7 +9,7 @@ from django.utils.translation import ugettext_lazy as _
 
 from biscuit.core.mixins import SchoolRelated
 
-from .util import current_week
+from .util import CalendarWeek
 
 
 class TimePeriod(SchoolRelated):
@@ -102,6 +102,13 @@ class Lesson(SchoolRelated):
     def group_names(self, sep: Optional[str] = ', ') -> str:
         return sep.join([group.short_name for group in self.groups.all()])
 
+    def get_calendar_week(self, week: int):
+        year = self.date_start.year
+        if week < int(self.date_start.strftime('%V')):
+           year += 1
+
+        return CalendarWeek(year=year, week=week)
+
     class Meta:
         ordering = ['date_start']
         indexes = [models.Index(fields=['date_start', 'date_end'])]
@@ -109,7 +116,7 @@ class Lesson(SchoolRelated):
 
 class LessonSubstitution(SchoolRelated):
     week = models.IntegerField(verbose_name=_('Week'),
-                               default=current_week)
+                               default=CalendarWeek().week)
 
     lesson_period = models.ForeignKey(
         'LessonPeriod', models.CASCADE, 'substitutions')
@@ -146,7 +153,7 @@ class LessonPeriod(SchoolRelated):
     room = models.ForeignKey('Room', models.CASCADE, null=True, related_name='lesson_periods')
 
     def get_substitution(self, week: Optional[int] = None) -> LessonSubstitution:
-        wanted_week = week or getattr(self, '_week', None) or current_week()
+        wanted_week = week or getattr(self, '_week', None) or CalendarWeek().week
 
         # We iterate over all substitutions because this can make use of
         # prefetching when this model is loaded from outside, in contrast
diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py
index 15fe30acf23423a061b3a462e164cdd5efa82aae..2972068e96db8a2f5f8c3de7e5870ac819bb55d8 100644
--- a/biscuit/apps/chronos/urls.py
+++ b/biscuit/apps/chronos/urls.py
@@ -5,7 +5,7 @@ from . import views
 
 urlpatterns = [
     path('timetable', views.timetable, name='timetable'),
-    path('timetable/<int:week>', views.timetable, name='timetable_by_week'),
+    path('timetable/<int:year>/<int:week>', views.timetable, name='timetable_by_week'),
     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'),
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index 67939a88148ca8c2c04c4dca9cf4e1dbaa647177..7d35a4212b568e00741b3fd7512028cc6ca7d9aa 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -22,11 +22,11 @@ from .tables import LessonsTable
 
 
 @login_required
-def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse:
+def timetable(request: HttpRequest, year: Optional[int], week: Optional[int] = None) -> HttpResponse:
     context = {}
 
-    if week:
-        wanted_week = CalendarWeek(week)  # FIXME Respect year as well
+    if year and week:
+        wanted_week = CalendarWeek(year=year, week=week)
     else:
         wanted_week = CalendarWeek()
 
@@ -38,7 +38,7 @@ def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse:
     ).prefetch_related(
         'lesson__groups', 'lesson__teachers', 'substitutions'
     ).extra(
-        select={'_week': wanted_week.week}  # FIXME respect year as well
+        select={'_week': wanted_week.week}
     )
 
     if request.GET.get('group', None) or request.GET.get('teacher', None) or request.GET.get('room', None):
@@ -48,7 +48,7 @@ def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse:
                 Q(lesson__groups__pk=int(request.GET['group'])) | Q(lesson__groups__parent_groups__pk=int(request.GET['group'])))
         if 'teacher' in request.GET and request.GET['teacher']:
             lesson_periods = lesson_periods.filter(
-                Q(substitutions__teachers__pk=int(request.GET['teacher']), substitutions__week=wanted_week.week) | Q(lesson__teachers__pk=int(request.GET['teacher'])))  # FIXME Respect year as well
+                Q(substitutions__teachers__pk=int(request.GET['teacher']), substitutions__week=wanted_week.week) | Q(lesson__teachers__pk=int(request.GET['teacher'])))
         if 'room' in request.GET and request.GET['room']:
             lesson_periods = lesson_periods.filter(
                 room__pk=int(request.GET['room']))
@@ -124,7 +124,7 @@ def lessons_day(request: HttpRequest, when: Optional[str] = None) -> HttpRespons
     )
 
     # Build table
-    lessons_table = LessonsTable(lesson_periods.extra(select={'_week': week.week}).all())  # FIXME Respect year as well
+    lessons_table = LessonsTable(lesson_periods.extra(select={'_week': week.week}).all())
     RequestConfig(request).configure(lessons_table)
 
     context['current_head'] = _('Lessons')
@@ -142,18 +142,15 @@ def lessons_day(request: HttpRequest, when: Optional[str] = None) -> HttpRespons
 def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse:
     context = {}
 
-    wanted_week = CalendarWeek(week=week)  # FIXME Respect year as well
-
-    lesson_period = get_object_or_404(LessonPeriod, pk=id_)
 
     lesson_substitution = LessonSubstitution.objects.filter(
-        week=wanted_week.week, lesson_period=lesson_period).first()  # FIXME Respect year as well
+        week=wanted_week.week, lesson_period=lesson_period).first()
     if lesson_substitution:
         edit_substitution_form = LessonSubstitutionForm(
             request.POST or None, instance=lesson_substitution)
     else:
         edit_substitution_form = LessonSubstitutionForm(
-            request.POST or None, initial={'week': wanted_week.week, 'lesson_period': lesson_period})  # FIXME Respect year as well
+            request.POST or None, initial={'week': wanted_week.week, 'lesson_period': lesson_period})
 
     context['substitution'] = lesson_substitution
 
@@ -173,10 +170,11 @@ def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse
 def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse:
     context = {}
 
-    wanted_week = CalendarWeek(week=week)  # FIXME Respect year as well
+    lesson_period = get_object_or_404(LessonPeriod, pk=id_)
+    wanted_week = lesson_period.lesson.get_calendar_week(week)
 
     LessonSubstitution.objects.filter(
-        week=wanted_week.week, lesson_period__id=id_  # FIXME Respect year as well
+        week=wanted_week.week, lesson_period=lesson_period
     ).delete()
 
     messages.success(request, _('The substitution has been deleted.'))