diff --git a/Resources/config/services.yml b/Resources/config/services.yml
index fcd95e88ec1b564bacc40cfe09392fabcecb39dd..1e876af811ada236339f7840835c644d76022f75 100644
--- a/Resources/config/services.yml
+++ b/Resources/config/services.yml
@@ -66,3 +66,11 @@ services:
             - @cl_tissue.scanner
         tags:
             - { name: kernel.event_listener, event: file_upload.complete, method: onFileUploadCompleted }
+
+    # Extension Twig
+    irstea_file_upload.twig_extension:
+        class: Irstea\FileUploadBundle\Twig\FileUploadExtension
+        arguments:
+            - @translator
+        tags:
+            - { name: twig.extension }
diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml
index d24d13e9faf5daccadd925a1d353f78eea2ed4b7..4a06d254c94f3591f6777528bb588bd814aa157c 100644
--- a/Resources/translations/messages.fr.yml
+++ b/Resources/translations/messages.fr.yml
@@ -7,3 +7,6 @@ form:
         max_number_of_files(%num%): %num% fichiers maximum
         min_file_size: Taille minimale
         max_file_size: Taille maximale
+
+file_upload:
+    file_size(%size%,%unit%): %size% %unit%o
diff --git a/Resources/views/Extension/uploaded_file.html.twig b/Resources/views/Extension/uploaded_file.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3b929a1f156a62fa8b1273dd52a44b0c0432cca6
--- /dev/null
+++ b/Resources/views/Extension/uploaded_file.html.twig
@@ -0,0 +1,17 @@
+{%- spaceless %}
+    <span class="uploaded-file">
+        {{- irstea_file_icon(file.type|default(null)) -}}
+        &nbsp;<span class="name">
+            <a href="{{
+                path('file_upload_get_content', {
+                    'id': file.id|default('__id__'),
+                    'token': csrf_token(constant('Irstea\\FileUploadBundle\\Controller\\UploadController::CSRF_INTENTION'))
+                })
+            }}">
+            {{- file.name|default('') -}}
+            </a>
+        </span>&nbsp;(<span class="size">
+            {{- file.size|default(0)|irstea_file_size -}}
+        </span>)
+    </span>
+{% endspaceless -%}
diff --git a/Twig/FileUploadExtension.php b/Twig/FileUploadExtension.php
new file mode 100644
index 0000000000000000000000000000000000000000..51f6294167ede18d1d644ffd99412d5a2af7f66f
--- /dev/null
+++ b/Twig/FileUploadExtension.php
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * Copyright (C) 2015 IRSTEA
+ * All rights reserved.
+ */
+
+namespace Irstea\FileUploadBundle\Twig;
+
+use Irstea\FileUploadBundle\Model\UploadedFileInterface;
+use Irstea\FileUploadBundle\Utils\MimeTypeIcon;
+use \NumberFormatter;
+use Symfony\Component\Translation\TranslatorInterface;
+use Twig_Environment;
+use Twig_Extension;
+use Twig_SimpleFilter;
+use Twig_SimpleFunction;
+
+/**
+ * Description of FileUploadExtension
+ *
+ * @author Guillaume Perréal <guillaume.perreal@irstea.fr>
+ */
+class FileUploadExtension extends Twig_Extension
+{
+    /**
+     *
+     * @var TranslatorInterface
+     */
+    private $translator;
+
+    /**
+     *
+     * @param TranslatorInterface $translator
+     */
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    public function getFunctions()
+    {
+        return [
+            new Twig_SimpleFunction(
+                'irstea_uploaded_file',
+                [$this, 'formatUploadedFile'],
+                [
+                    'needs_environment' => true,
+                    'is_safe' => ['html']
+                ]
+            ),
+            new Twig_SimpleFunction(
+                'irstea_file_icon',
+                [$this, 'formatFileIcon'],
+                ['is_safe' => ['html']]
+            ),
+        ];
+    }
+
+    public function getFilters()
+    {
+        return [
+            new Twig_SimpleFilter(
+                'irstea_file_size',
+                [$this, 'formatFileSize'],
+                ['needs_context' => true]
+            ),
+        ];
+    }
+
+    public function getName()
+    {
+        return "irstea_file_upload";
+    }
+
+    public function formatUploadedFile(Twig_Environment $env, $file = null)
+    {
+        if(null === $file) {
+            return '';
+        } elseif($file instanceof \Irstea\FileUploadBundle\Entity\UploadedFile) {
+            $file = $file->toArray();
+        } elseif(!is_array($file)) {
+            throw new \InvalidArgumentException("irstea_uploaded_file expects an UploadedFile instance, array or null");
+        }
+
+        return $env->render('IrsteaFileUploadBundle:Extension:uploaded_file.html.twig', ['file' => $file]);
+    }
+
+    public function formatFileIcon($mimeType)
+    {
+        $icon = MimeTypeIcon::getMimeTypeIcon($mimeType);
+        return sprintf('<i class="icon fa fa-file%s-o"></i>', ($icon && $icon !== 'file') ? ('-'.$icon) : '');
+    }
+
+    public function formatFileSize($context, $size, $precision = null, $locale = null)
+    {
+        if(!is_numeric($size)) {
+            return '';
+        }
+
+        if($size > 1000000000) {
+            $size /= 1000000000.0;
+            $unit = 'Gi';
+        } elseif($size > 1000000) {
+            $size /= 1000000.0;
+            $unit = 'Mi';
+        } elseif($size > 1000) {
+            $size /= 1000.0;
+            $unit = 'Ki';
+        } else {
+            $unit = '';
+        }
+
+        if(null === $locale) {
+            $locale = $context['app']->getRequest()->getLocale();
+        }
+
+        $formatter = NumberFormatter::create($locale, NumberFormatter::DECIMAL);
+        if(null !== $precision) {
+            $formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $precision);
+            $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $precision);
+        } else {
+            $formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 0);
+            $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
+        }
+
+        return $this->translator->trans(
+            'file_upload.file_size(%size%,%unit%)',
+            [
+                '%size%' => $formatter->format($size),
+                '%unit%' => $unit,
+            ],
+            null,
+            $locale
+        );
+    }
+}