diff --git a/biscuit/apps/alsijil/forms.py b/biscuit/apps/alsijil/forms.py
index cf9d90aab49a684d3a9b4269ae34290d6a049c3c..fde563a0e8b367fe0316acb696fab30e10cc5022 100644
--- a/biscuit/apps/alsijil/forms.py
+++ b/biscuit/apps/alsijil/forms.py
@@ -7,7 +7,7 @@ from datetime import datetime
 from biscuit.apps.chronos.models import Room
 from biscuit.core.models import Group, Person
 
-from .models import LessonDocumentation, PersonalNote
+from .models import LessonDocumentation, PersonalNote, PersonalNoteFilter
 
 
 class LessonDocumentationForm(forms.ModelForm):
@@ -58,3 +58,9 @@ class RegisterAbsenceForm(forms.Form):
     absent = forms.BooleanField(label=_('Absent'), initial=True, required=False)
     excused = forms.BooleanField(label=_('Excused'), initial=True, required=False)
     remarks = forms.CharField(label=_('Remarks'), max_length=30, required=False)
+
+
+class PersonalNoteFilterForm(forms.ModelForm):
+    class Meta:
+        model = PersonalNoteFilter
+        fields = ['identifier', 'description', 'regex']
diff --git a/biscuit/apps/alsijil/menus.py b/biscuit/apps/alsijil/menus.py
index 9dbabfd9c4387fe3d5456d94d4b48579cc1d750c..71a57bda5b2c6e651712250c8755a50887b5bdb9 100644
--- a/biscuit/apps/alsijil/menus.py
+++ b/biscuit/apps/alsijil/menus.py
@@ -22,6 +22,11 @@ MENUS = {
                     'name': _('Register absence'),
                     'url': 'register_absence',
                     'validators': ['menu_generator.validators.is_superuser']
+                },
+                {
+                    'name': _('Personal note filters'),
+                    'url': 'list_personal_note_filters',
+                    'validators': ['menu_generator.validators.is_superuser']
                 }
             ]
         }
diff --git a/biscuit/apps/alsijil/tables.py b/biscuit/apps/alsijil/tables.py
new file mode 100644
index 0000000000000000000000000000000000000000..83737766d548541a91bcb96f320c9740b6d9ea60
--- /dev/null
+++ b/biscuit/apps/alsijil/tables.py
@@ -0,0 +1,14 @@
+from django.utils.translation import ugettext_lazy as _
+import django_tables2 as tables
+from django_tables2.utils import A
+
+
+class PersonalNoteFilterTable(tables.Table):
+    class Meta:
+        attrs = {'class': 'table table-striped table-bordered table-hover table-responsive-xl'}
+
+    identifier = tables.Column()
+    description = tables.Column()
+    regex = tables.Column()
+    edit_filter = tables.LinkColumn(
+        'edit_personal_note_filter', args=[A('id')], text=_('Edit'))
diff --git a/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filter.html b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filter.html
new file mode 100644
index 0000000000000000000000000000000000000000..4382f9cfc5ae41f1260b247abcf0c389f971defc
--- /dev/null
+++ b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filter.html
@@ -0,0 +1,38 @@
+{# -*- engine:django -*- #}
+{% extends "core/base.html" %}
+{% load bootstrap4 i18n static font_awesome %}
+
+{% block bootstrap4_extra_head %}
+  {{ block.super }}
+  {{ personal_note_filter_form.media.css }}
+{% endblock %}
+
+{% block bootstrap4_extra_script %}
+  {{ block.super }}
+  {{ personal_note_filter_form.media.js }}
+{% endblock %}
+
+{% block bootstrap4_title %}{% blocktrans%}Manage personal note filter{% endblocktrans %} - {{ block.super }}{% endblock %}
+
+{% block page_title %}{% blocktrans %}Manage personal note filter{% endblocktrans %}{% endblock %}
+
+{% block content %}
+<div class="d-flex justify-content-between">
+    <div class="btn-group" role="group" aria-label="Filter actions">
+      {% if personal_note_filter %}
+        <a href="{% url 'delete_personal_note_filter' personal_note_filter.id %}" class="btn btn-danger">
+          {% fa 'trash-o' %}
+        </a>
+      {% endif %}
+    </div>
+  </div>
+
+  <form method="post">
+    {% csrf_token %}
+    {% bootstrap_form personal_note_filter_form %}
+    <button type="submit" class="btn btn-dark">
+      {% blocktrans %}Save{% endblocktrans %}
+    </button>
+  </form>
+
+{% endblock %}
diff --git a/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filters.html b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filters.html
new file mode 100644
index 0000000000000000000000000000000000000000..6de7779b136ac6ad64ef46907b2df1506c6e5f89
--- /dev/null
+++ b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filters.html
@@ -0,0 +1,38 @@
+{# -*- engine:django -*- #}
+{% extends "core/base.html" %}
+{% load bootstrap4 i18n static font_awesome %}
+
+{% block bootstrap4_extra_head %}
+  {{ block.super }}
+  {{ personal_note_filters_form.media.css }}
+{% endblock %}
+
+{% block bootstrap4_extra_script %}
+  {{ block.super }}
+  {{ personal_note_filters_form.media.js }}
+{% endblock %}
+
+{% block bootstrap4_title %}{% blocktrans%}Manage personal note filters{% endblocktrans %} - {{ block.super }}{% endblock %}
+
+{% block page_title %}{% blocktrans %}Manage personal note filters{% endblocktrans %}{% endblock %}
+
+{% block content %}
+<div class="d-flex justify-content-between">
+    <div class="btn-group" role="group" aria-label="Filter actions">
+      {% if personal_note_filters %}
+        <a href="{% url 'delete_personal_note_filters' personal_note_filters.id %}" class="btn btn-danger">
+          {% fa 'trash-o' %}
+        </a>
+      {% endif %}
+    </div>
+  </div>
+
+  <form method="post">
+    {% csrf_token %}
+    {% bootstrap_form personal_note_filters_form %}
+    <button type="submit" class="btn btn-dark">
+      {% blocktrans %}Save{% endblocktrans %}
+    </button>
+  </form>
+
+{% endblock %}
diff --git a/biscuit/apps/alsijil/templates/alsijil/personal_note_filters.html b/biscuit/apps/alsijil/templates/alsijil/personal_note_filters.html
new file mode 100644
index 0000000000000000000000000000000000000000..071b664dbfba56f9a2789e655ae683aba84e309b
--- /dev/null
+++ b/biscuit/apps/alsijil/templates/alsijil/personal_note_filters.html
@@ -0,0 +1,18 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/base.html" %}
+{% load bootstrap4 i18n font_awesome %}
+{% load render_table from django_tables2 %}
+
+{% block bootstrap4_title %}{% blocktrans %}List of all personal note filters{% endblocktrans %} - {{ block.super }}{% endblock %}
+{% block page_title %}{% blocktrans %}List of all personal note filters{% endblocktrans %}{% endblock %}
+
+{% block content %}
+ <div class="btn-group" role="group" aria-lable="Filter actions">
+    <a href="{% url 'create_personal_note_filter' %}" class="btn btn-dark">
+      {% fa 'plus' %}
+    </a>
+  </div>
+
+  {% render_table personal_note_filters_table %}
+{% endblock %}
diff --git a/biscuit/apps/alsijil/urls.py b/biscuit/apps/alsijil/urls.py
index 7aa5cd22ba0cd7f660077cf28ed98c95d5aa3d92..20327ec13f758353bcc9c7e8ecd3a2f78f39ab8a 100644
--- a/biscuit/apps/alsijil/urls.py
+++ b/biscuit/apps/alsijil/urls.py
@@ -14,4 +14,12 @@ urlpatterns = [
          name='full_register_group'),
     path('absence/new', views.register_absence,
          name='register_absence'),
+    path('filters/list', views.list_personal_note_filters,
+         name='list_personal_note_filters'),
+    path('filters/create', views.edit_personal_note_filter,
+         name='create_personal_note_filter'),
+    path('filters/edit/<int:id>', views.edit_personal_note_filter,
+         name='edit_personal_note_filter'),
+    path('filters/delete/<int:id_>', views.delete_personal_note_filter,
+         name='delete_personal_note_filter')
 ]
diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py
index f0d4a3d293c35fec4cb5997fe558ad456656ccbe..bea753276aa3130eafffe7aeb28f08ad816bb312 100644
--- a/biscuit/apps/alsijil/views.py
+++ b/biscuit/apps/alsijil/views.py
@@ -9,14 +9,17 @@ from django.shortcuts import get_object_or_404, redirect, render
 from django.urls import reverse
 from django.utils.translation import ugettext as _
 
+from django_tables2 import RequestConfig
+
 from biscuit.apps.chronos.models import LessonPeriod
 from biscuit.apps.chronos.util import CalendarWeek
 from biscuit.core.models import Group, Person
 from biscuit.core.decorators import admin_required
 from biscuit.core.util import messages
 
-from .forms import LessonDocumentationForm, PersonalNoteFormSet, RegisterAbsenceForm, SelectForm
+from .forms import LessonDocumentationForm, PersonalNoteFormSet, RegisterAbsenceForm, SelectForm, PersonalNoteFilterForm
 from .models import LessonDocumentation, PersonalNoteFilter
+from .tables import PersonalNoteFilterTable
 
 
 @login_required
@@ -247,3 +250,54 @@ def register_absence(request: HttpRequest) -> HttpResponse:
     context['register_absence_form'] = register_absence_form
 
     return render(request, 'alsijil/register_absence.html', context)
+
+
+def list_personal_note_filters(request: HttpRequest) -> HttpResponse:
+    context = {}
+
+    personal_note_filters = PersonalNoteFilter.objects.all()
+
+    # Prepare table
+    personal_note_filters_table = PersonalNoteFilterTable(personal_note_filters)
+    RequestConfig(request).configure(personal_note_filters_table)
+
+    context['personal_note_filters_table'] = personal_note_filters_table
+
+    return render(request, 'alsijil/personal_note_filters.html', context)
+
+
+def edit_personal_note_filter(request: HttpRequest, id: Optional['int'] = None) -> HttpResponse:
+    context = {}
+
+    if id:
+        personal_note_filter = PersonalNoteFilter.objects.get(id=id)
+        context['personal_note_filter'] = personal_note_filter
+        personal_note_filter_form = PersonalNoteFilterForm(
+            request.POST or None, instance=personal_note_filter)
+    else:
+        personal_note_filter_form = PersonalNoteFilterForm(
+            request.POST or None)
+    
+    if request.method == 'POST':
+        if personal_note_filter_form.is_valid():
+            personal_note_filter_form.save(commit=True)
+
+            messages.success(request, _('The filter has been saved'))
+            return redirect('list_personal_note_filters')
+
+    context['personal_note_filter_form'] = personal_note_filter_form
+
+    return render(request, 'alsijil/manage_personal_note_filter.html', context)
+
+@admin_required
+def delete_personal_note_filter(request: HttpRequest, id_: int) -> HttpResponse:
+    context = {}
+
+    personal_note_filter = get_object_or_404(PersonalNoteFilter, pk=id_)
+
+    PersonalNoteFilter.objects.filter(pk=id_).delete()
+    
+    messages.success(request, _('The filter has been deleted.'))
+
+    context['personal_note_filter'] = personal_note_filter
+    return redirect('list_personal_note_filters')