diff --git a/aleksis/apps/alsijil/migrations/0002_extra_mark.py b/aleksis/apps/alsijil/migrations/0002_extra_mark.py
new file mode 100644
index 0000000000000000000000000000000000000000..15715ae1d63776a881311d98dc9ea8432a9117d5
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0002_extra_mark.py
@@ -0,0 +1,72 @@
+# Generated by Django 3.0.8 on 2020-07-12 12:43
+
+import django.contrib.postgres.fields.jsonb
+import django.contrib.sites.managers
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("sites", "0002_alter_domain_unique"),
+        ("alsijil", "0001_initial"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="ExtraMark",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "extended_data",
+                    django.contrib.postgres.fields.jsonb.JSONField(
+                        default=dict, editable=False
+                    ),
+                ),
+                (
+                    "short_name",
+                    models.CharField(
+                        max_length=255, unique=True, verbose_name="Short name"
+                    ),
+                ),
+                (
+                    "name",
+                    models.CharField(max_length=255, unique=True, verbose_name="Name"),
+                ),
+                (
+                    "site",
+                    models.ForeignKey(
+                        default=1,
+                        editable=False,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="sites.Site",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "Extra mark",
+                "verbose_name_plural": "Extra marks",
+                "ordering": ["short_name"],
+            },
+            managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),],
+        ),
+        migrations.AddField(
+            model_name="personalnote",
+            name="extra_marks",
+            field=models.ManyToManyField(
+                blank=True,
+                null=True,
+                to="alsijil.ExtraMark",
+                verbose_name="Extra marks",
+            ),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index eb1bc4eb67f37744e589c8daf9d496ff6913f6d3..9473f54a069de45a21bda8059ea16285854e8f18 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -30,6 +30,10 @@ class PersonalNote(ExtensibleModel):
 
     remarks = models.CharField(max_length=200, blank=True)
 
+    extra_marks = models.ManyToManyField(
+        "ExtraMark", null=True, blank=True, verbose_name=_("Extra marks")
+    )
+
     class Meta:
         verbose_name = _("Personal note")
         verbose_name_plural = _("Personal notes")
@@ -91,3 +95,27 @@ class PersonalNoteFilter(ExtensibleModel):
         verbose_name = _("Personal note filter")
         verbose_name_plural = _("Personal note filters")
         ordering = ["identifier"]
+
+
+class ExtraMark(ExtensibleModel):
+    """A model for extra marks.
+
+    Can be used for lesson-based counting of things (like forgotten homework).
+    """
+
+    short_name = models.CharField(
+        max_length=255, unique=True, verbose_name=_("Short name")
+    )
+    name = models.CharField(max_length=255, unique=True, verbose_name=_("Name"))
+
+    def __str__(self):
+        return f"{self.name} ({self.short_name})"
+
+    @property
+    def count_label(self):
+        return f"{self.short_name}_count"
+
+    class Meta:
+        ordering = ["short_name"]
+        verbose_name = _("Extra mark")
+        verbose_name_plural = _("Extra marks")