diff --git a/backend/metagenedb/apps/catalog/migrations/0029_annotation_geneannotation.py b/backend/metagenedb/apps/catalog/migrations/0029_annotation_geneannotation.py
new file mode 100644
index 0000000000000000000000000000000000000000..d3749b2fcb8011cb9d6122333e78b3ee5dac13d9
--- /dev/null
+++ b/backend/metagenedb/apps/catalog/migrations/0029_annotation_geneannotation.py
@@ -0,0 +1,33 @@
+# Generated by Django 3.1.7 on 2021-04-08 15:05
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('catalog', '0028_index_source_and_functions'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Annotation',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=500)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='GeneAnnotation',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('annotation_category', models.CharField(choices=[('no-cat', 'No Category'), ('body-site', 'Body site')], default='no-cat', max_length=10)),
+                ('annotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='catalog.annotation')),
+                ('gene', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='catalog.gene')),
+            ],
+            options={
+                'unique_together': {('gene', 'annotation')},
+            },
+        ),
+    ]
diff --git a/backend/metagenedb/apps/catalog/models/annotation.py b/backend/metagenedb/apps/catalog/models/annotation.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f1ecd78fb6a1faf9bdf9b5aaa40ebb97d50a1ef
--- /dev/null
+++ b/backend/metagenedb/apps/catalog/models/annotation.py
@@ -0,0 +1,8 @@
+from django.db import models
+
+
+class Annotation(models.Model):
+    name = models.CharField(max_length=500, blank=True)
+
+    def __str__(self):
+        return self.name
diff --git a/backend/metagenedb/apps/catalog/models/gene.py b/backend/metagenedb/apps/catalog/models/gene.py
index 08e8449d52bf33499fb5b9536aeb899dd7cceca3..2e5240bdc933f2b42c3c0591ff7bfb61c251dd11 100644
--- a/backend/metagenedb/apps/catalog/models/gene.py
+++ b/backend/metagenedb/apps/catalog/models/gene.py
@@ -2,6 +2,7 @@ from itertools import repeat
 
 from django.db import models
 
+from .annotation import Annotation
 from .function import Function
 
 
@@ -95,3 +96,24 @@ class GeneFunction(models.Model):
         unique_together = [
             'gene', 'function'
         ]
+
+
+class GeneAnnotation(models.Model):
+    NO_CAT = 'no-cat'
+    BODY_SITE = 'body-site'
+    ANNOTATION_CHOICES = [
+        (NO_CAT, 'No Category'),
+        (BODY_SITE, 'Body site'),
+    ]
+
+    gene = models.ForeignKey(Gene, on_delete=models.CASCADE)
+    annotation = models.ForeignKey(Annotation, on_delete=models.CASCADE)
+    annotation_category = models.CharField(max_length=10, choices=ANNOTATION_CHOICES, default=NO_CAT)
+
+    def __str__(self):
+        return f"{self.gene.gene_id} <-> [{self.annotation_category}] {self.annotation.name}"
+
+    class Meta:
+        unique_together = [
+            'gene', 'annotation'
+        ]