diff --git a/AKModel/admin.py b/AKModel/admin.py
index ba2d8f15e8aa9e88fb06c6bf734697b913f33cf7..53d995823fbc95e53bb9d045b5501304b9ed9d8c 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -2,7 +2,14 @@
 
 from django.contrib import admin
 
-from AKModel.models import Event, AKOwner
+from AKModel.models import Event, AKOwner, AKType, AKTrack, AKTag, AKRequirement, AK
 
 admin.site.register(Event)
+
 admin.site.register(AKOwner)
+
+admin.site.register(AKType)
+admin.site.register(AKTrack)
+admin.site.register(AKTag)
+admin.site.register(AKRequirement)
+admin.site.register(AK)
diff --git a/AKModel/models.py b/AKModel/models.py
index 397a7921bad4192fb04b7d576ec4053fc0d751ce..a46a4aeccad8008f0c2fb927a0f6c393a75af293 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -28,3 +28,92 @@ class AKOwner(models.Model):
         verbose_name_plural = 'AK Owners'
         ordering = ['name']
         unique_together = [['name', 'institution']]
+
+
+class AKType(models.Model):
+    """ An AKType describes the characteristics of an AK, e.g. content vs. recreational.
+    """
+    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name of the AK Type')
+    color = models.CharField(max_length=7, blank=True, verbose_name='Color', help_text='Color to display this type in')
+
+    # TODO model availability
+
+    class Meta:
+        verbose_name = 'AK Type'
+        verbose_name_plural = 'AK Types'
+        ordering = ['name']
+
+
+class AKTrack(models.Model):
+    """ An AKTrack describes a set of semantically related AKs.
+    """
+    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name of the AK Track')
+    color = models.CharField(max_length=7, blank=True, verbose_name='Color', help_text='Color to display this track in')
+
+    class Meta:
+        verbose_name = 'AK Track'
+        verbose_name_plural = 'AK Tracks'
+        ordering = ['name']
+
+
+class AKTag(models.Model):
+    """ An AKTag is a keyword given to an AK by (one of) its owner(s).
+    """
+    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name of the AK Tag')
+
+    class Meta:
+        verbose_name = 'AK Tag'
+        verbose_name_plural = 'AK Tags'
+        ordering = ['name']
+
+
+class AKRequirement(models.Model):
+    """ An AKRequirement describes something needed to hold an AK, e.g. infrastructure.
+    """
+    name = models.CharField(max_length=128, unique=True, verbose_name='Name', help_text='Name of the AK Requirement')
+
+    event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name='Event', help_text='Matching event')
+
+    class Meta:
+        verbose_name = 'AK Requirement'
+        verbose_name_plural = 'AK Requirements'
+        ordering = ['name']
+
+
+class AK(models.Model):
+    """ An AK is a slot-based activity to be scheduled during an event.
+    """
+    name = models.CharField(max_length=256, unique=True, verbose_name='Name', help_text='Name of the AK')
+    short_name = models.CharField(max_length=64, unique=True, blank=True, verbose_name='Short Name',
+                                  help_text='Name displayed in schedule')
+    description = models.TextField(blank=True, verbose_name='Description', help_text='Description of the AK')
+
+    owners = models.ManyToManyField(to=AKOwner, verbose_name='Owners', help_text='Those organizing the AK')
+
+    # TODO generate automatically
+    link = models.URLField(blank=True, verbose_name='Web Link', help_text='Link to wiki page')
+
+    type = models.ForeignKey(to=AKType, on_delete=models.PROTECT, verbose_name='Type', help_text='Type of the AK')
+    tags = models.ManyToManyField(to=AKTag, blank=True, verbose_name='Tags', help_text='Tags provided by AK owners')
+    track = models.ForeignKey(to=AKTrack, on_delete=models.SET_NULL, null=True, verbose_name='Track',
+                              help_text='Track the AK belongs to.')
+
+    reso = models.BooleanField(verbose_name='Resolution Intention', default=False, help_text='Intends to submit a reso')
+    requirements = models.ManyToManyField(to=AKRequirement, blank=True, verbose_name='Requirements',
+                                          help_text="AK's Requirements")
+
+    conflicts = models.ManyToManyField(to='AK', blank=True, related_name='conflict', verbose_name='Conflicting AKs',
+                                       help_text='AKs that conflict and thus must not take place at the same time')
+    prerequisites = models.ManyToManyField(to='AK', blank=True, verbose_name='Prerequisite AKs',
+                                           help_text='AKs that should precede this AK in the schedule')
+    # TODO model availability
+
+    notes = models.TextField(blank=True, verbose_name='Internal Notes', help_text='Notes to organizers')
+
+    interest = models.IntegerField(default=-1, verbose_name='Interest', help_text='Expected number of people to attend')
+
+    event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name='Event', help_text='Matching event')
+
+    class Meta:
+        verbose_name = 'AK'
+        verbose_name_plural = 'AKs'