diff --git a/src/InSillyCloWeb/assemblies/forms.py b/src/InSillyCloWeb/assemblies/forms.py
index 55ce365fbd577d9dcf90940d6c255a18b3706ed3..1197eb80b04e33af1dafc640d08d9753e21eb8c5 100644
--- a/src/InSillyCloWeb/assemblies/forms.py
+++ b/src/InSillyCloWeb/assemblies/forms.py
@@ -58,15 +58,18 @@ class SimulatorDataForm(forms.Form):
 class PCRModelForm(forms.ModelForm):
     class Meta:
         model = SimulatorJob
-        fields = ('pcr_pairs_str',)
-        widgets = {'pcr_pairs_str': forms.Textarea(attrs={'rows': 2})}
-
-    primers_file = forms.FileField(
-        required=False,
-        label=_('Primers file'),
-        help_text=_('A CSV file where the header is \"primerId;sequence\".\nNote that the separator is \";\".'),
-        # widget=forms.ClearableFileInput(attrs={'multiple': False}),
-    )
+        fields = (
+            'pcr_pairs_str',
+            'primers_file',
+        )
+        widgets = {'pcr_pairs_str': forms.Textarea(attrs={'rows': 2}), 'primers_file': forms.ClearableFileInput()}
+
+    # primers_file = forms.FileField(
+    #     required=False,
+    #     label=_('Primers file'),
+    #     help_text=_('A CSV file where the header is \"primerId;sequence\".\nNote that the separator is \";\".'),
+    #     # widget=forms.ClearableFileInput(attrs={'multiple': False}),
+    # )
 
     # def __init__(self, *args, **kwargs):
     #     # files=kwargs.pop('files', dict())
diff --git a/src/InSillyCloWeb/assemblies/migrations/0009_simulatorjob_primers_file.py b/src/InSillyCloWeb/assemblies/migrations/0009_simulatorjob_primers_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b13a953ca303289eb9da5f8db8b528f6ab156d5
--- /dev/null
+++ b/src/InSillyCloWeb/assemblies/migrations/0009_simulatorjob_primers_file.py
@@ -0,0 +1,25 @@
+# Generated by Django 5.1.8 on 2025-04-18 14:06
+
+import assemblies.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('assemblies', '0008_simulatorjob_pcr_pairs_str_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='simulatorjob',
+            name='primers_file',
+            field=models.FileField(
+                blank=True,
+                help_text='A CSV file where the header is "primerId;sequence".\nNote that the separator is ";".',
+                null=True,
+                upload_to='assemblies.models.job_dependant_primers_file_upload_to',
+                verbose_name='Primers file',
+            ),
+        ),
+    ]
diff --git a/src/InSillyCloWeb/assemblies/models.py b/src/InSillyCloWeb/assemblies/models.py
index d22d772e95c307d74073bb63e73255a738bb134f..066d64b99712ad650e4d7bf7f9f0554f5914fce6 100644
--- a/src/InSillyCloWeb/assemblies/models.py
+++ b/src/InSillyCloWeb/assemblies/models.py
@@ -257,6 +257,18 @@ class JobStatus(models.IntegerChoices):
     __empty__ = "(Unknown)"
 
 
+class FixedFilenameJobDependantUploadTo:
+    def __init__(self, filename):
+        self.forced_filename = filename
+
+    def __call__(self, job, filename, *args, **kwargs):
+        return job.job_dir / self.forced_filename
+
+
+def job_dependant_primers_file_upload_to(job, filename):
+    return (job.job_dir / insillyclo.main.DEFAULT_PCR_FILENAME).relative_to(settings.MEDIA_ROOT)
+
+
 class SimulatorJob(models.Model):
     #########################################################################
     # Job attributs and parameters
@@ -286,6 +298,19 @@ class SimulatorJob(models.Model):
         help_text="In a CSV-like format where you have one pair per line, "
         "the forward primer first, then the reverse primer.",
     )
+    primers_file = models.FileField(
+        verbose_name=_('Primers file'),
+        help_text=_('A CSV file where the header is \"primerId;sequence\".\nNote that the separator is \";\".'),
+        blank=True,
+        null=True,
+        # upload_to=FixedFilenameJobDependantUploadTo(insillyclo.main.DEFAULT_PCR_FILENAME),
+        # upload_to=lambda o,f:o.run_dir/insillyclo.main.DEFAULT_PCR_FILENAME,
+        upload_to=job_dependant_primers_file_upload_to,
+        # validators=[
+        #     FileExtensionValidator(['pdf']),
+        #     FileMimeTypeValidator(['application/pdf']),
+        # ],
+    )
     restriction_enzyme_gel = models.TextField(
         default='',
         blank=True,