diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py
index 4c7741d3b89620b1682532192acf7fb9ad1c0196..ab9daaa7ebb171b9979fa8893fc7eaa0c598a31d 100644
--- a/aleksis/apps/alsijil/managers.py
+++ b/aleksis/apps/alsijil/managers.py
@@ -89,6 +89,9 @@ class PersonalNoteManager(CurrentSiteManagerWithoutMigrations):
                 "lesson_period__period",
                 "lesson_period__lesson__validity",
                 "lesson_period__lesson__validity__school_term",
+                "event",
+                "extra_lesson",
+                "extra_lesson__subject",
             )
             .prefetch_related("extra_marks")
         )
diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index e0bdb6c2ab21c80cd7932768d95d3a769e1a6f8e..1484c43df5454cde5b84b2ab7369a186d4593409 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -395,7 +395,9 @@ def generate_person_list_with_class_register_statistics(
         Q(groups=self) | Q(groups__parent_groups=self)
     )
 
-    persons = persons.select_related("primary_group", "primary_group__school_term")
+    persons = persons.select_related("primary_group", "primary_group__school_term").order_by(
+        "last_name", "first_name"
+    )
     persons = persons.annotate(
         filtered_personal_notes=FilteredRelation(
             "personal_notes",
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
index fa44199cb8609c753d38c01eebbfca9962639ed9..970a07558aa6b2d4308e2fc57d74f633723cd53f 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
@@ -318,12 +318,7 @@
             </span>
             {% for person in persons %}
               <h5 class="card-title">
-                {% has_perm "alsijil.view_person_overview" user person.person as can_view_person_overview %}
-                {% if can_view_person_overview %}
-                  <a href="{% url "overview_person" person.person.pk %}">{{ person.person.full_name }}</a>
-                {% else %}
-                  {{ person.person.full_name }}
-                {% endif %}
+                <a href="{% url "overview_person" person.person.pk %}">{{ person.person.full_name }}</a>
                 {% has_perm "alsijil.register_absence" user person.person as can_register_absence %}
                 {% if can_register_absence %}
                   <a class="btn primary-color waves-effect waves-light right"
@@ -335,7 +330,7 @@
               </h5>
               {% if group_roles %}
                 <p>
-                  {% for assignment in person.person.group_roles.all %}
+                  {% for assignment in person.group_roles %}
                     {% include "alsijil/group_role/chip.html" with role=assignment.role small=assignment.date_range %}
                   {% endfor %}
                 </p>
@@ -356,17 +351,15 @@
                 </p>
               {% endfor %}
               {% for note in person.personal_notes %}
-                {% if note.remarks %}
-                  <blockquote>
-                    {{ note.remarks }}
-                    {% weekday_to_date week note.register_object.period.weekday as note_date %}
-                    <em class="right">
-                      <a href="{{ note.register_object.alsijil_url }}">
-                        {{ note.date }}, {{ note.register_object.get_subject.name }}
-                      </a>
-                    </em>
-                  </blockquote>
-                {% endif %}
+                <blockquote>
+                  {{ note.remarks }}
+                  {% weekday_to_date week note.register_object.period.weekday as note_date %}
+                  <em class="right">
+                    <a href="{{ note.register_object.alsijil_url }}">
+                      {{ note.date }}, {{ note.register_object.get_subject.name }}
+                    </a>
+                  </em>
+                </blockquote>
               {% endfor %}
             {% endfor %}
           </div>
diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index 628ae7ae5e0079fe402df9e44c84ef9c07a36877..1759a5446d204d61c87f5bd1cbe9e3e031d95be2 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -98,13 +98,20 @@ def is_person_group_owner(user: User, obj: Person) -> bool:
     the owner of any group of the given person.
     """
     if obj:
-        for group in obj.member_of.all():
-            if user.person in list(group.owners.all()):
+        for group in use_prefetched(obj, "member_of"):
+            if user.person in use_prefetched(group, "owners"):
                 return True
         return False
     return False
 
 
+def use_prefetched(obj, attr):
+    prefetched_attr = f"{attr}_prefetched"
+    if hasattr(obj, prefetched_attr):
+        return getattr(obj, prefetched_attr)
+    return getattr(obj, attr).all()
+
+
 @predicate
 def is_person_primary_group_owner(user: User, obj: Person) -> bool:
     """
@@ -114,7 +121,7 @@ def is_person_primary_group_owner(user: User, obj: Person) -> bool:
     the owner of the primary group of the given person.
     """
     if obj.primary_group:
-        return user.person in obj.primary_group.owners.all()
+        return user.person in use_prefetched(obj.primary_group, "owners")
     return False
 
 
@@ -127,7 +134,7 @@ def has_person_group_object_perm(perm: str):
 
     @predicate(name)
     def fn(user: User, obj: Person) -> bool:
-        groups = obj.member_of.all()
+        groups = use_prefetched(obj, "member_of")
         for group in groups:
             if check_object_permission(user, perm, group, checker_obj=obj):
                 return True
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 23c2810e78962cee1f0d5ad182f3936d6eef7ff2..c4c4385f6e00bafe70e7c0147e0e974c9132d5d9 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -391,6 +391,7 @@ def week_view(
     if show_group_roles:
         group_roles = GroupRole.objects.with_assignments(wanted_week, [group])
         context["group_roles"] = group_roles
+        group_roles_persons = GroupRoleAssignment.objects.in_week(wanted_week).for_group(group)
 
     extra_marks = ExtraMark.objects.all()
 
@@ -398,11 +399,16 @@ def week_view(
         lesson_periods_pk = list(lesson_periods.values_list("pk", flat=True))
         lesson_periods = annotate_documentations(LessonPeriod, wanted_week, lesson_periods_pk)
 
-        events_pk = list(events.values_list("pk", flat=True))
+        events_pk = [event.pk for event in events]
         events = annotate_documentations(Event, wanted_week, events_pk)
 
         extra_lessons_pk = list(extra_lessons.values_list("pk", flat=True))
         extra_lessons = annotate_documentations(ExtraLesson, wanted_week, extra_lessons_pk)
+        groups = Group.objects.filter(
+            Q(lessons__lesson_periods__in=lesson_periods_pk)
+            | Q(events__in=events_pk)
+            | Q(extra_lessons__in=extra_lessons_pk)
+        )
     else:
         lesson_periods_pk = []
         events_pk = []
@@ -417,22 +423,35 @@ def week_view(
         elif group:
             persons_qs = persons_qs.filter(member_of=group)
         else:
-            persons_qs = persons_qs.filter(
-                Q(member_of__lessons__lesson_periods__in=lesson_periods_pk)
-                | Q(member_of__events__in=events_pk)
-                | Q(member_of__extra_lessons__in=extra_lessons_pk)
-            )
+            persons_qs = persons_qs.filter(member_of__in=groups)
 
         # Prefetch object permissions for persons and groups the persons are members of
         # because the object permissions are checked for both persons and groups
         checker = ObjectPermissionChecker(request.user)
-        checker.prefetch_perms(persons_qs)
-        checker.prefetch_perms(Group.objects.filter(members__in=persons_qs))
-
+        checker.prefetch_perms(persons_qs.prefetch_related(None))
+        checker.prefetch_perms(groups)
+
+        prefetched_personal_notes = list(
+            PersonalNote.objects.filter(  #
+                Q(event__in=events_pk)
+                | Q(
+                    week=wanted_week.week,
+                    year=wanted_week.year,
+                    lesson_period__in=lesson_periods_pk,
+                )
+                | Q(extra_lesson__in=extra_lessons_pk)
+            ).filter(~Q(remarks=""))
+        )
         persons_qs = (
-            Person.objects.filter(pk__in=persons_qs)
-            .select_related("primary_group")
-            .prefetch_related("primary_group__owners")
+            persons_qs.select_related("primary_group")
+            .prefetch_related(
+                Prefetch(
+                    "primary_group__owners",
+                    queryset=Person.objects.filter(pk=request.user.person.pk),
+                    to_attr="owners_prefetched",
+                ),
+                Prefetch("member_of", queryset=groups, to_attr="member_of_prefetched"),
+            )
             .annotate(
                 filtered_personal_notes=FilteredRelation(
                     "personal_notes",
@@ -447,31 +466,8 @@ def week_view(
                     ),
                 )
             )
-            .prefetch_related(
-                Prefetch(
-                    "personal_notes",
-                    queryset=PersonalNote.objects.filter(
-                        Q(event__in=events_pk)
-                        | Q(
-                            week=wanted_week.week,
-                            year=wanted_week.year,
-                            lesson_period__in=lesson_periods_pk,
-                        )
-                        | Q(extra_lesson__in=extra_lessons_pk)
-                    ),
-                ),
-                "member_of__owners",
-            )
         )
 
-        # Annotate group roles
-        if show_group_roles:
-            persons_qs = persons_qs.prefetch_related(
-                Prefetch(
-                    "group_roles",
-                    queryset=GroupRoleAssignment.objects.in_week(wanted_week).for_group(group),
-                ),
-            )
         persons_qs = persons_qs.annotate(
             absences_count=Count(
                 "filtered_personal_notes", filter=Q(filtered_personal_notes__absent=True),
@@ -501,12 +497,17 @@ def week_view(
         persons = []
         for person in persons_qs:
             personal_notes = []
-            for note in person.personal_notes.all():
+            for note in filter(lambda note: note.person_id == person.pk, prefetched_personal_notes):
                 if note.lesson_period:
                     note.lesson_period.annotate_week(wanted_week)
                 personal_notes.append(note)
             person.set_object_permission_checker(checker)
-            persons.append({"person": person, "personal_notes": personal_notes})
+            person_dict = {"person": person, "personal_notes": personal_notes}
+            if show_group_roles:
+                person_dict["group_roles"] = filter(
+                    lambda role: role.person_id == person.pk, group_roles_persons
+                )
+            persons.append(person_dict)
     else:
         persons = None
 
@@ -706,12 +707,26 @@ def my_students(request: HttpRequest) -> HttpResponse:
         .distinct()
     )
 
+    # Prefetch object permissions for persons and groups the persons are members of
+    # because the object permissions are checked for both persons and groups
+    all_persons = Person.objects.filter(member_of__in=relevant_groups)
+    checker = ObjectPermissionChecker(request.user)
+    checker.prefetch_perms(relevant_groups)
+    checker.prefetch_perms(all_persons)
+
     new_groups = []
     for group in relevant_groups:
         persons = group.generate_person_list_with_class_register_statistics(
-            group.members.prefetch_related("primary_group__owners")
+            group.members.prefetch_related(
+                "primary_group__owners",
+                Prefetch("member_of", queryset=relevant_groups, to_attr="member_of_prefetched"),
+            )
         )
-        new_groups.append((group, persons))
+        persons_for_group = []
+        for person in persons:
+            person.set_object_permission_checker(checker)
+            persons_for_group.append(person)
+        new_groups.append((group, persons_for_group))
 
     context["groups"] = new_groups
     context["excuse_types"] = ExcuseType.objects.all()