diff --git a/aleksis/apps/alsijil/filters.py b/aleksis/apps/alsijil/filters.py
new file mode 100644
index 0000000000000000000000000000000000000000..c6bda959e7a07d8aff42d59fe5ea7663d4c12b4f
--- /dev/null
+++ b/aleksis/apps/alsijil/filters.py
@@ -0,0 +1,28 @@
+from django.utils.translation import gettext as _
+
+from django_filters import FilterSet, CharFilter, ModelMultipleChoiceFilter
+from material import Layout, Row
+
+from .models import ExcuseType, PersonalNote
+
+
+class PersonalNoteFilter(FilterSet):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.form.layout = Layout(
+            # TODO: Row with day (lt and gt) and subject (char search),
+            Row("absent", "excused", "excuse_type"),
+            Row("late__lt", "late__gt", "extra_marks")
+        )
+
+    class Meta:
+        model = PersonalNote
+        fields = {
+            "excused": ["exact"],
+            "late": ["lt", "gt"],
+            "absent": ['exact'],
+            "excuse_type": ["exact"],
+            "extra_marks": ["exact"],
+            # TODO: "date??": ['lt', 'gt'],
+            # TODO: "subject??": "exact",
+        }
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index edf9c1f892806dce1565ec352401a08434d073bf..c3bfd95ff9c4b2a33f714daa54ab09a1e8b4c33f 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -40,6 +40,7 @@ from aleksis.core.util import messages
 from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional
 from aleksis.core.util.predicates import check_global_permission
 
+from .filters import PersonalNoteFilter
 from .forms import (
     AssignGroupRoleForm,
     ExcuseTypeForm,
@@ -808,6 +809,10 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
             "-school_term_start", "-order_year", "-order_week", "-order_weekday", "order_period",
         )
     )
+    personal_note_filter_object = PersonalNoteFilter(request.GET, queryset=personal_notes)
+    filtered_personal_notes = personal_note_filter_object.qs
+    context["personal_note_filter_form"] = personal_note_filter_object.form
+
     personal_notes_list = []
     for note in personal_notes:
         note.set_object_permission_checker(checker)
@@ -824,7 +829,7 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
                 form.execute()
             person.refresh_from_db()
     context["action_form"] = form
-    table = PersonalNoteTable(personal_notes)
+    table = PersonalNoteTable(filtered_personal_notes)
     RequestConfig(request, paginate={"per_page": 20}).configure(table)
     context["personal_notes_table"] = table
     print(table.columns, table.rows, sep="\n" * 3)