diff --git a/rex/admin.py b/rex/admin.py
index e6670247a4ba4e73c03817476b0b494f40dce90b..9dc87fa4cd92bf98158a8b9dfba4e8f627b5f731 100644
--- a/rex/admin.py
+++ b/rex/admin.py
@@ -1,11 +1,13 @@
 from django.contrib import admin
 from reversion_compare.admin import CompareVersionAdmin
 
-from rex.models.university import University
+from rex.models.university import University, MainCampus
 from rex.models.localization import Country, Region, City
 
 
-admin.site.register(University, CompareVersionAdmin)
 admin.site.register(Country)
 admin.site.register(Region)
 admin.site.register(City)
+
+admin.site.register(University, CompareVersionAdmin)
+admin.site.register(MainCampus)
diff --git a/rex/migrations/0004_maincampus.py b/rex/migrations/0004_maincampus.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a9a4d7d1a1b0af6cfc5160db695f67df0eeb8f8
--- /dev/null
+++ b/rex/migrations/0004_maincampus.py
@@ -0,0 +1,32 @@
+# Generated by Django 2.0.3 on 2018-04-25 09:22
+
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('rex', '0003_city'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='MainCampus',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('modified_date', models.DateTimeField(auto_now=True)),
+                ('comment', models.TextField(null=True)),
+                ('lat', models.DecimalField(decimal_places=6, max_digits=10, validators=[django.core.validators.MinValueValidator(-85.05112878), django.core.validators.MaxValueValidator(85.05112878)])),
+                ('lon', models.DecimalField(decimal_places=6, max_digits=10, validators=[django.core.validators.MinValueValidator(-180), django.core.validators.MaxValueValidator(180)])),
+                ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='rex.City')),
+                ('modified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+    ]
diff --git a/rex/migrations/0005_auto_20180425_1131.py b/rex/migrations/0005_auto_20180425_1131.py
new file mode 100644
index 0000000000000000000000000000000000000000..3309246d72a9e9bb14b04f04542abde0ef4e21b5
--- /dev/null
+++ b/rex/migrations/0005_auto_20180425_1131.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.0.3 on 2018-04-25 09:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('rex', '0004_maincampus'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='maincampus',
+            name='comment',
+            field=models.TextField(blank=True, null=True),
+        ),
+    ]
diff --git a/rex/migrations/0006_maincampus_name.py b/rex/migrations/0006_maincampus_name.py
new file mode 100644
index 0000000000000000000000000000000000000000..b689b9554fae6a0457cb48e4e085a54bb1d37546
--- /dev/null
+++ b/rex/migrations/0006_maincampus_name.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.0.3 on 2018-04-25 09:33
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('rex', '0005_auto_20180425_1131'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='maincampus',
+            name='name',
+            field=models.CharField(max_length=200, null=True),
+        ),
+    ]
diff --git a/rex/models/__init__.py b/rex/models/__init__.py
index 48458e0cf42ce80d8576f6e7aa676aaa5ec3696e..29d77d8dce4cb51bb17378b4502a45d89ab821df 100644
--- a/rex/models/__init__.py
+++ b/rex/models/__init__.py
@@ -1,2 +1,3 @@
 from .localization import localization  # noqa: F401
 from .university import university  # noqa: F401
+from .module import module  # noqa: F401
diff --git a/rex/models/module/__init__.py b/rex/models/module/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b0b8597cf752570f4cbe9837ebc781a6f4d6f66
--- /dev/null
+++ b/rex/models/module/__init__.py
@@ -0,0 +1 @@
+from .module import Module  # noqa: F401
diff --git a/rex/models/module/module.py b/rex/models/module/module.py
new file mode 100644
index 0000000000000000000000000000000000000000..d60c9d818d963a6abfa5271c93a0a5bdb502a66b
--- /dev/null
+++ b/rex/models/module/module.py
@@ -0,0 +1,20 @@
+from django.db import models
+from rest_framework import serializers, viewsets, permissions
+from django.contrib.auth.models import User
+
+
+class Module(models.Model):
+    modified_date = models.DateTimeField(auto_now=True)
+    modified_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
+    
+    module_icon = "You forget to override the icon in the sub-class"
+    module_name = "You forget to override the name in the sub-class"
+    module_description = "You forget to override the description in the sub-class"
+
+    class Meta:
+        abstract = True
+
+
+"""
+API RELATED STUFF BELLOW
+"""
diff --git a/rex/models/university/__init__.py b/rex/models/university/__init__.py
index b2d3412e8defb105f849fe6b5a5394f66ee13de6..7a80bf600bbd98700c6fca82599d877b4b065a3d 100644
--- a/rex/models/university/__init__.py
+++ b/rex/models/university/__init__.py
@@ -1 +1,2 @@
 from .university import University  # noqa: F401
+from .campus import MainCampus  # noqa: F401
diff --git a/rex/models/university/campus.py b/rex/models/university/campus.py
new file mode 100644
index 0000000000000000000000000000000000000000..5164c1d362948c9e7bbf9f2a0f14ea3174fd7ba5
--- /dev/null
+++ b/rex/models/university/campus.py
@@ -0,0 +1,33 @@
+from django.db import models
+from rex.models.module import Module
+from rex.models.localization import City
+from django.core.validators import MinValueValidator, MaxValueValidator
+
+
+class Campus(Module):
+    name = models.CharField(max_length=200, null=True)
+    comment = models.TextField(null=True, blank=True)
+    city = models.ForeignKey(City, on_delete=models.PROTECT, null=False)
+
+    lat = models.DecimalField(
+        max_digits=10,
+        decimal_places=6,
+        validators=[MinValueValidator(-85.05112878),
+                    MaxValueValidator(85.05112878)]
+    )
+
+    lon = models.DecimalField(
+        max_digits=10,
+        decimal_places=6,
+        validators=[MinValueValidator(-180),
+                    MaxValueValidator(180)]
+    )
+
+    class Meta:
+        abstract = True
+
+
+class MainCampus(Campus):
+    module_icon = "You forget to override the icon in the sub-class : I know"
+    module_name = "Campus principal"
+    module_description = "Campus principal de l'université."