diff --git a/biscuit/apps/alsijil/templates/alsijil/group_week.html b/biscuit/apps/alsijil/templates/alsijil/group_week.html
index 1c8a29be8607f099b6b955c10c8267ed59507d7d..bff57e1e535712cd6ef06d4ed6ff95c6254acce2 100644
--- a/biscuit/apps/alsijil/templates/alsijil/group_week.html
+++ b/biscuit/apps/alsijil/templates/alsijil/group_week.html
@@ -56,7 +56,7 @@
                     ">
                       <td>{{ period.period.period }}</td>
                       <td>
-                        <a href="{% url 'lesson_by_week_and_period' week period.id %}">
+                        <a href="{% url 'lesson_by_week_and_period' week.year week.week period.id %}">
                           {{ period.get_subject.name }}
                         </a>
                       </td>
diff --git a/biscuit/apps/alsijil/urls.py b/biscuit/apps/alsijil/urls.py
index a414c158775b94e02197f95cd4ced42eaa198fbd..be2a34da2ea91237a8bc778a9c5d0d7ba60a0415 100644
--- a/biscuit/apps/alsijil/urls.py
+++ b/biscuit/apps/alsijil/urls.py
@@ -5,9 +5,9 @@ from . import views
 
 urlpatterns = [
     path('lesson', views.lesson, name='lesson'),
-    path('lesson/<int:week>/<int:period_id>', views.lesson,
+    path('lesson/<int:year>/<int:week>/<int:period_id>', views.lesson,
          name='lesson_by_week_and_period'),
     path('group/week', views.group_week, name='group_week'),
-    path('group/week/<int:week>', views.group_week,
+    path('group/week/<int:year>/<int:week>', views.group_week,
          name='group_week_by_week'),
 ]
diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py
index 536656a23291866d15e02e7e7e1355484e336b63..80db74032f11d1b626c8c4a9c3e7948665d9aae0 100644
--- a/biscuit/apps/alsijil/views.py
+++ b/biscuit/apps/alsijil/views.py
@@ -9,7 +9,7 @@ from django.utils.translation import ugettext as _
 from django.views.decorators.cache import cache_page
 
 from biscuit.apps.chronos.models import LessonPeriod, TimePeriod
-from biscuit.apps.chronos.util import current_lesson_periods, current_week, week_days
+from biscuit.apps.chronos.util import CalendarWeek, current_lesson_periods
 from biscuit.core.models import Group, Person
 
 from .forms import LessonDocumentationForm, PersonalNoteFormSet, SelectForm
@@ -17,36 +17,36 @@ from .models import LessonDocumentation, PersonalNote
 
 
 @login_required
-def lesson(request: HttpRequest, week: Optional[int] = None, period_id: Optional[int] = None) -> HttpResponse:
+def lesson(request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None, period_id: Optional[int] = None) -> HttpResponse:
     context = {}
 
-    if week and period_id:
+    if year and week and period_id:
         # Get a specific lesson period if provided in URL
         lesson_period = LessonPeriod.objects.get(pk=period_id)
-        wanted_week = week
+        wanted_week = CalendarWeek(year=year, week=week)
     else:
         # Determine current lesson by current date and time
         lesson_period = current_lesson_periods().filter(
             Q(substitutions__teachers=request.user.person) | Q(lesson__teachers=request.user.person)).first()
-        wanted_week = current_week()
+        wanted_week = CalendarWeek()
 
     if not lesson_period:
         raise Http404(_('You either selected an invalid lesson or there is currently no lesson in progress.'))
 
     context['lesson_period'] = lesson_period
     context['week'] = wanted_week
-    context['day'] = week_days(wanted_week)[lesson_period.period.weekday - 1]
+    context['day'] = wanted_week[lesson_period.period.weekday - 1]
 
     # Create or get lesson documentation object; can be empty when first opening lesson
     lesson_documentation, created = LessonDocumentation.objects.get_or_create(
-        lesson_period=lesson_period, week=wanted_week)
+        lesson_period=lesson_period, week=wanted_week.week)
     lesson_documentation_form = LessonDocumentationForm(
         request.POST or None, instance=lesson_documentation, prefix='leson_documentation')
 
     # Find all persons in the associated groups that do not yet have a personal note for this lesson
     missing_persons = Person.objects.annotate(
         no_personal_notes=~Exists(PersonalNote.objects.filter(
-            week=wanted_week,
+            week=wanted_week.week,
             lesson_period=lesson_period,
             person__pk=OuterRef('pk')
         ))
@@ -59,12 +59,12 @@ def lesson(request: HttpRequest, week: Optional[int] = None, period_id: Optional
     # Create all missing personal notes
     PersonalNote.objects.bulk_create([
         PersonalNote(person=person, lesson_period=lesson_period,
-                     week=wanted_week) for person in missing_persons
+                     week=wanted_week.week) for person in missing_persons  # FIXME Respect year as well
     ])
 
     # Create a formset that holds all personal notes for all persons in this lesson
     persons_qs = PersonalNote.objects.select_related('person').filter(
-        lesson_period=lesson_period, week=wanted_week)
+        lesson_period=lesson_period, week=wanted_week.week)  # FIXME Respect year as well
     personal_note_formset = PersonalNoteFormSet(
         request.POST or None, queryset=persons_qs, prefix='personal_notes')
 
@@ -82,12 +82,16 @@ def lesson(request: HttpRequest, week: Optional[int] = None, period_id: Optional
 
 
 @login_required
-def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse:
+def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None) -> HttpResponse:
     context = {}
 
-    wanted_week = week or current_week()
-    week_start = week_days(wanted_week)[0]
-    week_end = week_days(wanted_week)[-1]
+    if year and week:
+        wanted_week = CalendarWeek(year=year, week=week)
+    else:
+        wanted_week = CalendarWeek()
+
+    week_start = wanted_week[0]
+    week_end = wanted_week[-1]
 
     if request.GET.get('group', None):
         # Use requested group
@@ -104,7 +108,7 @@ def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse
             has_documentation=Exists(LessonDocumentation.objects.filter(
                 ~Q(topic__exact=''),
                 lesson_period=OuterRef('pk'),
-                week=wanted_week
+                week=wanted_week.week
             ))
         ).filter(
             lesson__date_start__lte=week_start,
@@ -114,7 +118,7 @@ def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse
         ).prefetch_related(
             'lesson__groups', 'lesson__teachers', 'substitutions'
         ).extra(
-            select={'_week': wanted_week}
+            select={'_week': wanted_week.week}
         ).filter(
             Q(lesson__groups=group) | Q(lesson__groups__parent_groups=group)
         ).distinct()
@@ -128,15 +132,18 @@ def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse
             'personal_notes'
         ).annotate(
             absences=Count('personal_notes__absent', filter=Q(
+                personal_notes__lesson_period__in=lesson_periods,
                 personal_notes__week=wanted_week,
                 personal_notes__absent=True
             )),
             unexcused=Count('personal_notes__absent', filter=Q(
+                personal_notes__lesson_period__in=lesson_periods,
                 personal_notes__week=wanted_week,
                 personal_notes__absent=True,
                 personal_notes__excused=False
             )),
             tardiness=Sum('personal_notes__late', filter=Q(
+                personal_notes__lesson_period__in=lesson_periods,
                 personal_notes__week=wanted_week
             ))
         )
@@ -149,13 +156,17 @@ def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse
 
 
 
-    context['current_head'] = _('Week (%s %s - %s) ') % (wanted_week, week_start, week_end)
+    context['current_head'] = str(wanted_week)
     context['week'] = wanted_week
-    context['url_next'] = '%s?%s' % (reverse('group_week_by_week', week=wanted_week + 1), request.GET.urlencode())
-    context['url_prev'] = '%s?%s' % (reverse('group_week_by_week', week=wanted_week - 1), request.GET.urlencode())
     context['group'] = group
     context['lesson_periods'] = lesson_periods
     context['persons'] = persons
     context['select_form'] = select_form
 
+    week_prev = wanted_week - 1
+    week_next = wanted_week + 1
+    context['url_next'] = '%s?%s' % (reverse('group_week_by_week', year=week_prev.year, week=week_prev.week), request.GET.urlencode())
+    context['url_prev'] = '%s?%s' % (reverse('group_week_by_week', year=week_next.year, week=week_next.week), request.GET.urlencode())
+
+
     return render(request, 'alsijil/group_week.html', context)