diff --git a/.gitignore b/.gitignore
index 80f6558244150543497b421304c705164e144181..da92d8adf030fcf8ceb4e5410ec683d6f39734ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,10 @@ migrations/
 
 // Virtualenv
 env/
+
+uploadexample/media
+uploadfront/
+
+# System Files
+.DS_Store
+Thumbs.db
diff --git a/README.md b/README.md
index b7a5803cbb0e65d80394dcd06a856283757ba5e3..468bfb3e525fbf6ed5b70f62f8f0b7cc44e98e35 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,8 @@ Il s'agit d'une petite application CRD (Create, Read, Delete) autour d'un modèl
 
 Ce dernier champ est un champ de fichier où l'utilisateur doit fournir un fichier PDF. Pour tester l'application, on pourra utiliser `sample-data/doej.pdf`.
 
+On peut consulter la liste des dossiers, supprimer un dossier existant ou ajouter un nouveau dossier.
+
 ![](docsmedia/home.png)
 ![](docsmedia/form.png)
 
@@ -34,7 +36,17 @@ $ python manage.py migrate
 $ python manage.py runserver
 ```
 
-Le site sera accessible à l'adresse `http://localhost:8000`.
+Le site sera accessible à l'adresse `http://localhost:8000/`.
+
+### API
+
+Au cas où on voudrait utiliser cette app avec un frontend JS, une petite API REST a été implémentée à l'aide du Django REST Framework.
+
+Les ressources utiles sont dispos sur le serveur Django :
+
+- Browsable API : `http://localhost:8000/api/`
+- Documentation : `http://localhost:8000/api/docs/`
+
 
 ## Notes d'implémentation
 
@@ -56,7 +68,7 @@ Lorsqu'un fichier est uploadé via un formulaire, Django le placera dans le doss
 
 #### Service des médias en développement
 
-Dans un contexte de développement, on peut se permettre de servir les fichiers de médias et les fichiers statiques par Django. **Cette approche n'est pas efficace en production** : la solution à employer et alors de passer par un serveur web dédié aux fichiers statiques et aux médias, tel que nginx.
+Dans un contexte de développement, on peut se permettre de servir les fichiers de médias et les fichiers statiques par Django.
 
 ```python
 # uploadexample/urls.py
@@ -68,6 +80,8 @@ if settings.DEBUG:
                           document_root=settings.STATIC_ROOT)
 ```
 
+> **Cette approche n'est pas efficace en production** : la solution à employer et alors de passer par un serveur web dédié aux fichiers statiques et aux médias, tel que nginx.
+
 #### Écriture du modèle
 
 Sur le modèle, on utilise un champ `FileField` :
@@ -81,11 +95,9 @@ class StudentRegistration(models.Model):
 	...
 ```
 
-Le *serializer* est tout-à-fait classique et est défini dans `upload/serializers.py`.
-
 #### Côté front
 
-La gestion du formulaire côté frontend est ici assurée par le Django REST Framework (rendu d'un *serializer* comme un formulaire). Ce n'est pas une nécessité et le front pourrait tout aussi bien se faire en JS (même si cet exemple ne dispose pas d'une API REST et serait donc à adapter).
+La gestion du formulaire côté frontend est ici assurée par le système de vues et de templates inclus Django (et ne passe pas par l'API).
 
 Les templates utilisés sont dans le dossier `upload/templates`. La chose la plus importante à noter concerne le `<form>` de création d'un nouveau dossier d'inscription : il doit définir `enctype="multipart/form-data` pour permettre la transmission de fichiers via la requête HTTP POST.
 
@@ -103,33 +115,35 @@ Django stocke les fichiers sur le serveur et expose l'URL du fichier via l'attri
 <a href="{{ registration.image_agreement.url }}">Droit à l'image</a>
 ```
 
-Dans le cas d'un frontend Javascript, il est tout-à-fait envisageable de fournir l'URL directement dans le JSON d'une requête de type `GET /api/registrations/`. Libre au front d'utiliser cette URL comme bon lui semble : lien vers le fichier ou affichage direct dans la page... La réponse JSON ressemblera typiquement à:
+L'API REST expose l'URL dans la réponse JSON. Un frontend JS pourrait alors utiliser cette URL pour, par exemple, l'associer à un lien ou afficher le PDF directement sur la page. La réponse JSON associée à `GET /registrations/` ressemble typiquement à :
 
 ```json
 [
-	{
-		"first_name": "John",
-		"last_name": "Doe",
-		"url": "http://localhost:8000/media/doej.pdf"
-	},
-	"..."
+    {
+        "id": 65,
+        "first_name": "John",
+        "last_name": "Doe",
+        "image_agreement": "http://localhost:8000/media/doej.pdf",
+        "submission_date": "2018-02-10"
+    },
+    ...
 ]
 ```
 
-## Gestion des fichiers inutilisés
+### Gestion des fichiers inutilisés
 
-Lorsqu'un modèle ayant un ou plusieurs champs `FileField` est supprimé, les fichiers correspondants ne sont pas supprimés du serveur, et deviennent inutilisés (c'est un choix délibéré du framework).
+Lorsqu'un modèle ayant un ou plusieurs champs `FileField` est supprimé, les fichiers correspondants deviennent "orphelins", c'est-à-dire qu'ils n'ont plus de références dans les modèles mais restent physiquement sur le serveur. Django choisit délibérément de ne pas supprimer automatiquement le fichier physique associé.
 
-On doit alors supprimer manuellement ou par une tâche périodique (job Cron) les fichiers inutilisés. Une commande de gestion a été définie dans cet exemple (définie dans `upload/management/commands/clean_media.py`) et s'utilise comme suit :
+On doit alors supprimer manuellement ou par une tâche périodique (job Cron) les fichiers inutilisés. Une commande de gestion a été définie dans cet exemple (voir `upload/management/commands/clean_media.py`) et s'utilise comme suit :
 
 ```sh
 $ python manage.py clean_media
 # Si des médias inutilisés sont détectés :
-Detected unused media files:
-	doej.pdf
-Deleted 1 unused media file(s).
+Unused media files were detected:
+doej.pdf
+Removed 1 unused media file(s).
 # Sinon :
 No unusued media files detected.
 ```
 
-Cette commande n'est pas spécifique à cette application et se contente de **supprimer tous les fichiers qui ne sont référencés par aucun modèle de la DB**.
+Cette commande n'est pas spécifique à cette application et se contente de **supprimer tous les fichiers qui ne sont référencés par aucun modèle de la DB**. On pourrait la réutiliser dans une autre application.
diff --git a/docsmedia/form.png b/docsmedia/form.png
index 928e372d95333cdce8c40d2c8b5f1ad454c33663..d147e82241d9eff1318afcfe9cd940a138fe7332 100644
Binary files a/docsmedia/form.png and b/docsmedia/form.png differ
diff --git a/docsmedia/home.png b/docsmedia/home.png
index ac3f8af3237f8d8606f1d5149351c962d4bdaa20..473cf90dcfaa483a1c4b043ee9a4d75c825270b6 100644
Binary files a/docsmedia/home.png and b/docsmedia/home.png differ
diff --git a/uploadexample/api/serializers.py b/uploadexample/api/serializers.py
index 379cfe260795e2df2bfcaa9b922ef08f9d646e40..8ec2b44fef17e797d4a6a1193f54a3980a124f10 100644
--- a/uploadexample/api/serializers.py
+++ b/uploadexample/api/serializers.py
@@ -1,6 +1,5 @@
 from rest_framework import serializers
 from upload.models import StudentRegistration
-from .validators import FileValidator
 
 
 class StudentRegistrationSerializer(serializers.ModelSerializer):
@@ -10,11 +9,6 @@ class StudentRegistrationSerializer(serializers.ModelSerializer):
         fields = ('id', 'first_name', 'last_name', 'image_agreement',
                   'submission_date',)
         extra_kwargs = {
-            'image_agreement': {
-                'validators': [
-                    FileValidator(allowed_mimetypes=('application/pdf',)),
-                ],
-            },
             'submission_date': {
                 'format': '%Y-%m-%d',
             }
diff --git a/uploadexample/upload/management/commands/clean_media.py b/uploadexample/upload/management/commands/clean_media.py
index 4173b59c8a1f14b1f02cd60bf75f51024aff6ead..bc37b63283c3774f311c5400fb74f4b0a1d64979 100644
--- a/uploadexample/upload/management/commands/clean_media.py
+++ b/uploadexample/upload/management/commands/clean_media.py
@@ -76,7 +76,7 @@ class Command(BaseCommand):
 
         if deletables:
             unused = len(deletables)
-            self.stdout.write('Detected unused media files:')
+            self.stdout.write('Unused media files were detected:')
             self.stdout.write('\n'.join(f_ for f_ in deletables))
 
             for file_ in deletables:
@@ -89,7 +89,7 @@ class Command(BaseCommand):
                     if not os.listdir(os.path.join(relative_root, dir_)):
                         os.rmdir(os.path.join(relative_root, dir_))
             self.stdout.write(
-                self.style.SUCCESS('Deleted {} unused media file(s).'
+                self.style.SUCCESS('Removed {} unused media file(s).'
                                    .format(unused)))
         else:
             self.stdout.write(self.style.SUCCESS(
diff --git a/uploadexample/uploadexample/settings.py b/uploadexample/uploadexample/settings.py
index 27c71663b119c7c70c0d0f390f06e31dcaa081c4..168b33d4542ccf81623a6295c4f924ce5e11c88e 100644
--- a/uploadexample/uploadexample/settings.py
+++ b/uploadexample/uploadexample/settings.py
@@ -26,7 +26,7 @@ SECRET_KEY = '!m(&*&!b(i7@!8gxg-7f*!&j9&s!3d=*)l^q-1-1$b7__c0g67'
 # SECURITY WARNING: don't run with debug turned on in production!
 DEBUG = True
 
-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ['68556d9b.ngrok.io', 'localhost']
 
 
 MESSAGE_TAGS = {
diff --git a/uploadfront b/uploadfront
deleted file mode 160000
index 7d638632964e91a9c1667431fd7071aa4d142b2e..0000000000000000000000000000000000000000
--- a/uploadfront
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7d638632964e91a9c1667431fd7071aa4d142b2e