diff --git a/web/chatview.html b/web/chatview.html
index cf11b40..9ceff8c 100644
--- a/web/chatview.html
+++ b/web/chatview.html
@@ -427,14 +427,39 @@
      * @param message_div the message to update
      * @param message_object new informations
      */
-     function updateFileInteraction(message_div, message_object) {
+     function updateFileInteraction(message_div, message_object, forceTypeToFile = false) {
+       if (!message_div.querySelector('.informations')) return // media
+
        var acceptSvg = '<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/></svg>',
            refuseSvg = '<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/><path d="M0 0h24v24H0z" fill="none"/></svg>',
            fileSvg = '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4V5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1V6H10v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V5c0-2.21-1.79-4-4-4S7 2.79 7 5v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5V6h-1.5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>',
            warningSvg = '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></svg>'
-       var message_delivery_status = message_object["delivery_status"];
-       var message_direction = message_object["direction"];
-       var message_id = message_object["id"];
+       var message_delivery_status = message_object["delivery_status"]
+       var message_direction = message_object["direction"]
+       var message_id = message_object["id"]
+       var message_text = message_object['text']
+
+
+       if (isImage(message_text) && message_delivery_status === 'finished' && displayLinksEnabled && !forceTypeToFile) {
+         // Replace the old wrapper by the downloaded image
+         if (message_div.querySelector('.message_wrapper')) {
+           wrapper = message_div.querySelector('.message_wrapper')
+           wrapper.parentNode.removeChild(wrapper)
+         }
+         message_div.append(mediaInteraction(message_id, message_text))
+         message_div.querySelector('img').id = message_id
+         message_div.querySelector('img').msg_obj = message_object
+         message_div.querySelector('img').onerror = function() {
+           message_div = document.querySelector('#message_' + this.id);
+           if (message_div.querySelector('.message_wrapper')) {
+             wrapper = message_div.querySelector('.message_wrapper')
+             wrapper.parentNode.removeChild(wrapper)
+           }
+           message_div.append(fileInteraction(message_id))
+           updateFileInteraction(message_div, this.msg_obj, true)
+         }
+         return
+       }
 
        // Set informations text
        var informations_div = message_div.querySelector(".informations");
@@ -483,8 +508,10 @@
          left_buttons.appendChild(status_button);
        }
 
-       message_div.querySelector('.full').innerText = message_object['text']
-       message_div.querySelector('.filename').innerText = message_object['text'].split('/').pop()
+       message_div.querySelector('.full').innerText = message_text
+       message_div.querySelector('.filename').innerText = message_text.split('/').pop()
+       message_div.querySelector('.filename').innerText = message_text.split('/').pop()
+       updateProgressBar(message_div.querySelector('.message_progress_bar'), message_object);
        updateProgressBar(message_div.querySelector('.message_progress_bar'), message_object);
      }
 
@@ -493,7 +520,7 @@
      * @param file
      */
     function isImage(file) {
-      return file.match(/\.(jpeg|jpg|gif|png)$/) !== null
+      return file.toLowerCase().match(/\.(jpeg|jpg|gif|png)$/) !== null
     }
 
     /**
@@ -514,7 +541,7 @@
      * @param link to show
      * @param ytid if it's a youtube video
      */
-    function mediaInteraction(message_id, link, ytid) {
+    function mediaInteraction(message_id, link, ytid, noerror) {
       // TODO promise?
       // Try to display images.
       const media_wrapper = document.createElement('div')
@@ -526,7 +553,8 @@
       // Note, here, we don't check the size of the image.
       // in the future, we can check the content-type and content-length with a request
       // and maybe disable svg
-      imageElt.setAttribute('onerror', 'this.style.display=\'none\'')
+      if (noerror)
+        imageElt.setAttribute('onerror', 'this.style.display=\'none\'')
       if (ytid) {
         imageElt.src = `http://img.youtube.com/vi/${ytid}/0.jpg`
       } else {
@@ -730,8 +758,22 @@
 
         // Build main content
         if (message_type === 'data_transfer') {
-            type = 'fileInteraction'
+          if (isImage(message_text) && delivery_status === 'finished' && displayLinksEnabled) {
+            message_div.append(mediaInteraction(message_id, message_text, null, false))
+            message_div.querySelector('img').id = message_id
+            message_div.querySelector('img').msg_obj = message_object
+            message_div.querySelector('img').onerror = function() {
+              message_div = document.querySelector('#message_' + this.id);
+              if (message_div.querySelector('.message_wrapper')) {
+                wrapper = message_div.querySelector('.message_wrapper')
+                wrapper.parentNode.removeChild(wrapper)
+              }
+              message_div.append(fileInteraction(message_id))
+              updateFileInteraction(message_div, this.msg_obj, true)
+            }
+          } else {
             message_div.append(fileInteraction(message_id))
+          }
         } else if (message_type === 'text') {
           // TODO add the possibility to update messages (remove and rebuild)
           const htmlText = getMessageHtml(message_text)
