diff --git a/Controller/UploadController.php b/Controller/UploadController.php
index ac403c84992e0575016cc979595bc733ec63c028..f7ace7187b946a81b913853376555008515fa7ce 100644
--- a/Controller/UploadController.php
+++ b/Controller/UploadController.php
@@ -23,8 +23,9 @@ use Symfony\Component\HttpFoundation\ResponseHeaderBag;
 use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
 use Symfony\Component\HttpKernel\Exception\HttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
-use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+use Symfony\Component\Templating\EngineInterface;
 
 /**
  * @Route("/api/files", service="irstea_file_upload.upload_controller")
@@ -41,9 +42,9 @@ class UploadController extends Controller
 
     /**
      *
-     * @var RouterInterface
+     * @var UrlGeneratorInterface
      */
-    protected $router;
+    protected $urlGenerator;
 
     /**
      * @var CsrfProviderInterface
@@ -55,15 +56,26 @@ class UploadController extends Controller
      */
     protected $tokenStorage;
 
+    /**
+     * @var EngineInterface
+     */
+    protected $templating;
+
     /**
      *
      */
-    public function __construct(FileManagerInterface $fileManager, RouterInterface $router, CsrfProviderInterface $csrfProvider, TokenStorageInterface $tokenStorage)
-    {
+    public function __construct(
+        FileManagerInterface $fileManager,
+        UrlGeneratorInterface $urlGenerator,
+        CsrfProviderInterface $csrfProvider,
+        TokenStorageInterface $tokenStorage,
+        EngineInterface $templating
+    ) {
         $this->fileManager = $fileManager;
-        $this->router = $router;
+        $this->urlGenerator = $urlGenerator;
         $this->csrfProvider = $csrfProvider;
         $this->tokenStorage = $tokenStorage;
+        $this->templating = $templating;
     }
 
     /**
@@ -89,7 +101,7 @@ class UploadController extends Controller
 
             $parameters = ['id' => $file->getId()];
 
-            $deleteUrl = $this->router->generate('file_upload_delete', $parameters);
+            $deleteUrl = $this->urlGenerator->generate('file_upload_delete', $parameters);
 
             return $this->createResponse(
                 Response::HTTP_CREATED,
@@ -97,7 +109,7 @@ class UploadController extends Controller
                 array_merge(
                     $file->toArray(),
                     [
-                        'put_url'     => $this->router->generate('file_upload_put_content', $parameters),
+                        'put_url'     => $this->urlGenerator->generate('file_upload_put_content', $parameters),
                         'delete_type' => 'DELETE',
                         'delete_url'  => $deleteUrl
                     ]
@@ -174,33 +186,27 @@ class UploadController extends Controller
      */
     protected function completeUpload(UploadedFileInterface $file)
     {
-        $status = Response::HTTP_OK;
-        $message = 'File uploaded';
         try {
             $this->fileManager->completed($file);
         } catch(RejectedFileException $ex) {
-            $status = Response::HTTP_FORBIDDEN;
-            $message = 'File rejected: '.$ex->getMessage();
+            return $this->createResponse(Response::HTTP_FORBIDDEN, 'File rejected: '.$ex->getMessage());
         }
 
         $parameters = ['id' => $file->getId()];
-
-        return $this->createResponse(
-            $status,
-            $message,
+        $fileData = array_merge(
+            $file->toArray(),
             [
-                'files' => [
-                    array_merge(
-                        $file->toArray(),
-                        [
-                            'url'         => $this->router->generate('file_upload_get_content', $parameters),
-                            'delete_type' => 'DELETE',
-                            'delete_url'  => $this->router->generate('file_upload_delete', $parameters),
-                        ]
-                    )
-                ]
+                'url'         => $this->urlGenerator->generate('file_upload_get_content', $parameters),
+                'delete_type' => 'DELETE',
+                'delete_url'  => $this->urlGenerator->generate('file_upload_delete', $parameters),
+                'repr'        => $this->templating->render(
+                    'IrsteaFileUploadBundle:Extension:uploaded_file.html.twig',
+                    ['file' => $file->toArray()]
+                )
             ]
         );
+
+        return $this->createResponse(Response::HTTP_OK, 'File uploaded.', ['files' => [$fileData]]);
     }
 
     /**
diff --git a/Resources/config/services.yml b/Resources/config/services.yml
index 770f4a8d4939e211a2991dd97c6ab9ea589a363a..869289a32f80228a125ba9e0551a9c5a37a5a957 100644
--- a/Resources/config/services.yml
+++ b/Resources/config/services.yml
@@ -32,6 +32,7 @@ services:
             - @router
             - @form.csrf_provider
             - @security.token_storage
+            - @templating
 
     # Type de champ
     irstea_file_upload.field_type:
diff --git a/Resources/js/widget/file_upload.js b/Resources/js/widget/file_upload.js
index 7a75a1614dfc8ae9493e027dc0b5c6071296c36d..b5b916478bd6a5799341551f760ac9ec23f6ea7b 100644
--- a/Resources/js/widget/file_upload.js
+++ b/Resources/js/widget/file_upload.js
@@ -140,20 +140,12 @@
                             showError(row, file.error);
                             return;
                         }
-                        row.find('.size').text(formatFileSize(file.size));
-                        row.find('.name a')
-                            .text(file.name)
-                            .prop('href', file.url + csrfQuery);
+                        row.find('.repr').innerHtml(file.repr);
                         row.find('.delete')
                             .attr('data-type', file.delete_type)
                             .attr('data-url', file.delete_url + csrfQuery);
                         row.find('input.id')
                             .val(file.id);
-                        if (file.icon && file.icon !== 'file') {
-                            row.find('.icon')
-                                .removeClass('fa-file-o')
-                                .addClass('fa-file-' + file.icon + '-o');
-                        }
                     });
                     return rows;
                 },
diff --git a/Resources/views/Form/file_upload.html.twig b/Resources/views/Form/file_upload.html.twig
index e59624b304a3b9018b340eb8c211dbdec6de3344..1cfa93017f12bf4555301b47aeb6628e848aa3f4 100644
--- a/Resources/views/Form/file_upload.html.twig
+++ b/Resources/views/Form/file_upload.html.twig
@@ -18,7 +18,7 @@
     {%- set file = file|default([]) %}
     <div class="template-download fileinput-entry">
         <input class="id" type="hidden" name="{{ full_name }}{% if multiple %}[{{index|default('__index__')}}]{% endif %}[id]" value="{{ file.id|default }}"/>
-        {{ irstea_uploaded_file(file) }}
+        <span class="repr">{{ irstea_uploaded_file(file) }}</span>
         <input class="form-control description" type="text" placeholder="{% trans from 'file_upload' %}form.description.placeholder{% endtrans %}" name="{{ full_name }}{% if multiple %}[{{index|default('__index__')}}]{% endif %}[description]" value="{{ file.description|default }}"/>
         <span class="error"></span>
         <a href="#" class="danger delete {%- if disabled or read_only %} disabled{% endif -%}" title="{% trans %}button.delete{% endtrans %}">