diff --git a/WSR/migrations/0017_racetype_alter_race_type.py b/WSR/migrations/0017_racetype_alter_race_type.py
new file mode 100644
index 0000000000000000000000000000000000000000..189f5c60295016bfe8ddd08c903be668b054dd43
--- /dev/null
+++ b/WSR/migrations/0017_racetype_alter_race_type.py
@@ -0,0 +1,46 @@
+from django.db import migrations, models
+
+
+def create_race_types(apps, schema_editor):
+    Race = apps.get_model('WSR', 'Race')
+    RaceType = apps.get_model('WSR', 'RaceType')
+
+    race_types = set([race.type for race in Race.objects.all()])
+
+    with schema_editor.connection.cursor() as cursor:
+        for race_type in race_types:
+            instance, created = RaceType.objects.get_or_create(name=race_type)
+            if created:
+                instance.description = "Description du type de course"
+                instance.save()
+
+            cursor.execute(
+                "UPDATE WSR_race SET type = %s WHERE type = %s",
+                [instance.id, race_type]
+            )
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('WSR', '0016_vehicle_image_alter_driver_vehicle_and_more'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='RaceType',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=100)),
+                ('description', models.TextField(blank=True, default='')),
+                ('font_awesome_icon', models.CharField(blank=True, default='', max_length=64)),
+                ('image',
+                 models.ImageField(blank=True, default='', upload_to='racetypes', verbose_name="Image d'illustration")),
+            ],
+        ),
+        migrations.RunPython(create_race_types),
+        migrations.AlterField(
+            model_name='race',
+            name='type',
+            field=models.ForeignKey(on_delete=models.deletion.CASCADE, to='WSR.RaceType'),
+        ),
+    ]
diff --git a/WSR/models.py b/WSR/models.py
index 31b450a689ef1b2fc96503e121f6bea170ab9609..1ba6f58dde6b0ffd05955276cf405519ed62758b 100644
--- a/WSR/models.py
+++ b/WSR/models.py
@@ -27,20 +27,17 @@ class Vehicle(models.Model):
     def __str__(self):
         return f"{self.brand} {self.model}"
 
+class RaceType(models.Model):
+    name = models.CharField(max_length=100)
+    description = models.TextField(default="", blank=True)
+    font_awesome_icon = models.CharField(max_length=64, default="", blank=True)
+    image = models.ImageField(upload_to='racetypes', default="", blank=True, verbose_name="Image d'illustration")
+
+    def __str__(self):
+        return self.name
 
-class Race(models.Model):
-    class RaceType(models.TextChoices):
-        CHAMPIONSHIP = "championship"
-        SINGLE_RACE = "single_race"
-        FACE_TO_FACE = "face_to_face"
-        OVERTAKING = "overtaking"
-        AGAINST_TIME = "against_time"
-        ELIMINATION = "elimination"
-        ENDURANCE = "endurance"
-        TOUGE = "touge"
-        CHECKPOINT = "checkpoint"
-        DRIFT = "drift"
 
+class Race(models.Model):
     class RaceParticipationType(models.TextChoices):
         INVITATION = "invitation"
         PARTICIPATION = "participation"
@@ -85,7 +82,7 @@ class Race(models.Model):
     finishing_position = models.PositiveIntegerField(verbose_name="Position d'arrivée")
     season = models.ForeignKey(Season, on_delete=models.CASCADE)
     image = models.ImageField(upload_to='race_images', verbose_name="Image d'illustration")
-    type = models.CharField(max_length=100, choices=RaceType.choices, default=RaceType.SINGLE_RACE)
+    type = models.ForeignKey(RaceType, on_delete=models.CASCADE)
     participation_type = models.CharField(
         max_length=100,
         choices=RaceParticipationType.choices,