diff --git a/Entity/Repository/UploadedFileRepository.php b/Entity/Repository/UploadedFileRepository.php
index eb7f60bcf22ea210b8f825ab1c522111f61d7ae9..592e4d36da6b06b716806982d559e47620a021e8 100644
--- a/Entity/Repository/UploadedFileRepository.php
+++ b/Entity/Repository/UploadedFileRepository.php
@@ -84,6 +84,41 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
         return $file;
     }
 
+    public function duplicate(UploadedFileInterface $original)
+    {
+        if (!$original->isValid()) {
+            throw new \InvalidArgumentException("Impossible de dupliquer le fichier ".$original->getId()." car il est invalide !");
+        }
+
+        $new = new UploadedFile();
+
+        $metadata = $original->getMetadata();
+        if (!isset($metadata["duplicateOf"])) {
+            $metadata["duplicateOf"] = [$original->getId()];
+        } else {
+            array_unshift($metadata["duplicateOf"], $original->getId());
+        }
+
+        $new
+            ->setFilesystem($this->filesystem)
+            ->setMetadata($metadata)
+            ->setDisplayName($original->getDisplayName())
+            ->setDescription($original->getDescription())
+            ->setMimeType($original->getMimeType())
+            ->setChecksum($original->getChecksum())
+            ->setSize($original->getSize());
+
+        $stream = $this->filesystem->createStream($new->getPath());
+        $stream->open("cb");
+        $original->copyTo($stream);
+        $stream->close();
+
+        $this->_em->persist($new);
+        $this->_em->flush();
+
+        return $new;
+    }
+
     public function delete(UploadedFileInterface $file)
     {
         $this->_em->remove($file);
diff --git a/Model/FileManagerInterface.php b/Model/FileManagerInterface.php
index 4616577b0072b8f7f3a04b5257a3084aba697af3..eff9ebf8d11148dab1df9d70c0ab3fe5cb05076b 100644
--- a/Model/FileManagerInterface.php
+++ b/Model/FileManagerInterface.php
@@ -41,6 +41,17 @@ interface FileManagerInterface
      */
     public function create($name, $size, $mimeType, $lastModified = null);
 
+    /** Duplique un fichier.
+     *
+     * N'accepte que des fichiers valides.
+     * Le nouveau fichier est automatiquement orphelin, avec un chemin par défaut.
+     *
+     * @param UploadedFileInterface $original
+     * @return UploadedFileInterface
+     * @throw InvalidArgumentException Le fichier original est invalide.
+     */
+    public function duplicate(UploadedFileInterface $original);
+
     /** Supprime un fichier uploadé.
      *
      * *Attention :* le fichier est supprimé du disque !