diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.xml
index fba1b56a0bf1aa2a6e1c9ddd36ebae8fdb54e4f7..989453194a25880b47766e9eb872b1c40530edf7 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.xml
@@ -769,137 +769,81 @@ if (typeof document.contains !== \'function\') {\n
  }\n
 }\n
 ;/*! RenderJs */\n
-/*global console*/\n
 /*jslint nomen: true*/\n
-function loopEventListener(target, type, useCapture, callback) {\n
-  "use strict";\n
-  //////////////////////////\n
-  // Infinite event listener (promise is never resolved)\n
-  // eventListener is removed when promise is cancelled/rejected\n
-  //////////////////////////\n
-  var handle_event_callback,\n
-    callback_promise;\n
-\n
-  function cancelResolver() {\n
-    if ((callback_promise !== undefined) &&\n
-        (typeof callback_promise.cancel === "function")) {\n
-      callback_promise.cancel();\n
-    }\n
-  }\n
-\n
-  function canceller() {\n
-    if (handle_event_callback !== undefined) {\n
-      target.removeEventListener(type, handle_event_callback, useCapture);\n
-    }\n
-    cancelResolver();\n
-  }\n
-  function itsANonResolvableTrap(resolve, reject) {\n
-\n
-    handle_event_callback = function (evt) {\n
-      evt.stopPropagation();\n
-      evt.preventDefault();\n
-      cancelResolver();\n
-      callback_promise = new RSVP.Queue()\n
-        .push(function () {\n
-          return callback(evt);\n
-        })\n
-        .push(undefined, function (error) {\n
-          if (!(error instanceof RSVP.CancellationError)) {\n
-            canceller();\n
-            reject(error);\n
-          }\n
-        });\n
-    };\n
-\n
-    target.addEventListener(type, handle_event_callback, useCapture);\n
-  }\n
-  return new RSVP.Promise(itsANonResolvableTrap, canceller);\n
-}\n
 \n
 /*\n
  * renderJs - Generic Gadget library renderer.\n
  * http://www.renderjs.org/documentation\n
  */\n
 (function (document, window, RSVP, DOMParser, Channel, MutationObserver,\n
-           Node) {\n
+           Node, FileReader, Blob) {\n
   "use strict";\n
 \n
-  var gadget_model_dict = {},\n
-    javascript_registration_dict = {},\n
-    stylesheet_registration_dict = {},\n
-    gadget_loading_klass,\n
-    loading_klass_promise,\n
-    renderJS,\n
-    Monitor;\n
-\n
-  /////////////////////////////////////////////////////////////////\n
-  // Helper functions\n
-  /////////////////////////////////////////////////////////////////\n
-  function listenHashChange(gadget) {\n
-\n
-    function extractHashAndDispatch(evt) {\n
-      var hash = (evt.newURL || window.location.toString()).split(\'#\')[1],\n
-        subhashes,\n
-        subhash,\n
-        keyvalue,\n
-        index,\n
-        options = {};\n
-      if (hash === undefined) {\n
-        hash = "";\n
-      } else {\n
-        hash = hash.split(\'?\')[0];\n
-      }\n
+  function readBlobAsDataURL(blob) {\n
+    var fr = new FileReader();\n
+    return new RSVP.Promise(function (resolve, reject) {\n
+      fr.addEventListener("load", function (evt) {\n
+        resolve(evt.target.result);\n
+      });\n
+      fr.addEventListener("error", reject);\n
+      fr.readAsDataURL(blob);\n
+    }, function () {\n
+      fr.abort();\n
+    });\n
+  }\n
 \n
-      function optionalize(key, value, dict) {\n
-        var key_list = key.split("."),\n
-          kk,\n
-          i;\n
-        for (i = 0; i < key_list.length; i += 1) {\n
-          kk = key_list[i];\n
-          if (i === key_list.length - 1) {\n
-            dict[kk] = value;\n
-          } else {\n
-            if (!dict.hasOwnProperty(kk)) {\n
-              dict[kk] = {};\n
+  function ajax(url) {\n
+    var xhr;\n
+    function resolver(resolve, reject) {\n
+      function handler() {\n
+        try {\n
+          if (xhr.readyState === 0) {\n
+            // UNSENT\n
+            reject(xhr);\n
+          } else if (xhr.readyState === 4) {\n
+            // DONE\n
+            if ((xhr.status < 200) || (xhr.status >= 300) ||\n
+                (!/^text\\/html[;]?/.test(\n
+                  xhr.getResponseHeader("Content-Type") || ""\n
+                ))) {\n
+              reject(xhr);\n
+            } else {\n
+              resolve(xhr);\n
             }\n
-            dict = dict[kk];\n
           }\n
+        } catch (e) {\n
+          reject(e);\n
         }\n
       }\n
 \n
-      subhashes = hash.split(\'&\');\n
-      for (index in subhashes) {\n
-        if (subhashes.hasOwnProperty(index)) {\n
-          subhash = subhashes[index];\n
-          if (subhash !== \'\') {\n
-            keyvalue = subhash.split(\'=\');\n
-            if (keyvalue.length === 2) {\n
-\n
-              optionalize(decodeURIComponent(keyvalue[0]),\n
-                decodeURIComponent(keyvalue[1]),\n
-                options);\n
-\n
-            }\n
-          }\n
-        }\n
-      }\n
+      xhr = new XMLHttpRequest();\n
+      xhr.open("GET", url);\n
+      xhr.onreadystatechange = handler;\n
+      xhr.setRequestHeader(\'Accept\', \'text/html\');\n
+      xhr.withCredentials = true;\n
+      xhr.send();\n
+    }\n
 \n
-      if (gadget.render !== undefined) {\n
-        return gadget.render(options);\n
+    function canceller() {\n
+      if ((xhr !== undefined) && (xhr.readyState !== xhr.DONE)) {\n
+        xhr.abort();\n
       }\n
     }\n
-\n
-    var result = loopEventListener(window, \'hashchange\', false,\n
-                                   extractHashAndDispatch),\n
-      event = document.createEvent("Event");\n
-\n
-    event.initEvent(\'hashchange\', true, true);\n
-    event.newURL = window.location.toString();\n
-    window.dispatchEvent(event);\n
-    return result;\n
+    return new RSVP.Promise(resolver, canceller);\n
   }\n
 \n
+  var gadget_model_dict = {},\n
+    javascript_registration_dict = {},\n
+    stylesheet_registration_dict = {},\n
+    gadget_loading_klass,\n
+    loading_klass_promise,\n
+    renderJS,\n
+    Monitor,\n
+    isAbsoluteOrDataURL = new RegExp(\'^(?:[a-z]+:)?//|data:\', \'i\');\n
 \n
+  /////////////////////////////////////////////////////////////////\n
+  // Helper functions\n
+  /////////////////////////////////////////////////////////////////\n
   function removeHash(url) {\n
     var index = url.indexOf(\'#\');\n
     if (index > 0) {\n
@@ -1229,8 +1173,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
     };\n
   RenderJSGadget.declareAcquiredMethod("aq_reportServiceError",\n
                                        "reportServiceError");\n
-  RenderJSGadget.declareAcquiredMethod("aq_pleasePublishMyState",\n
-                                       "pleasePublishMyState");\n
 \n
   /////////////////////////////////////////////////////////////////\n
   // RenderJSGadget.allowPublicAcquisition\n
@@ -1250,22 +1192,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
                                            argument_list]);\n
     };\n
   }\n
-\n
-  function pleasePublishMyState(param_list, child_gadget_scope) {\n
-    var new_param = {},\n
-      key;\n
-    for (key in this.state_parameter_dict) {\n
-      if (this.state_parameter_dict.hasOwnProperty(key)) {\n
-        new_param[key] = this.state_parameter_dict[key];\n
-      }\n
-    }\n
-    if (child_gadget_scope === undefined) {\n
-      throw new Error("gadget scope is mandatory");\n
-    }\n
-    new_param[child_gadget_scope] = param_list[0];\n
-    param_list = [new_param];\n
-    return this.aq_pleasePublishMyState.apply(this, param_list);\n
-  }\n
 \n
   /////////////////////////////////////////////////////////////////\n
   // RenderJSEmbeddedGadget\n
@@ -1452,6 +1378,33 @@ function loopEventListener(target, type, useCapture, callback) {\n
       RSVP.timeout(5000)\n
     ]);\n
   }\n
+\n
+  /////////////////////////////////////////////////////////////////\n
+  // privateDeclareDataUrlGadget\n
+  /////////////////////////////////////////////////////////////////\n
+  function privateDeclareDataUrlGadget(url, options, parent_gadget) {\n
+\n
+    return new RSVP.Queue()\n
+      .push(function () {\n
+        return ajax(url);\n
+      })\n
+      .push(function (xhr) {\n
+        // Insert a "base" element, in order to resolve all relative links\n
+        // which could get broken with a data url\n
+        var doc = (new DOMParser()).parseFromString(xhr.responseText,\n
+                                                    \'text/html\'),\n
+          base = doc.createElement(\'base\'),\n
+          blob;\n
+        base.href = url;\n
+        doc.head.insertBefore(base, doc.head.firstChild);\n
+        blob = new Blob([doc.documentElement.outerHTML],\n
+                        {type: "text/html;charset=UTF-8"});\n
+        return readBlobAsDataURL(blob);\n
+      })\n
+      .push(function (data_url) {\n
+        return privateDeclareIframeGadget(data_url, options, parent_gadget);\n
+      });\n
+  }\n
 \n
   /////////////////////////////////////////////////////////////////\n
   // RenderJSGadget.declareGadget\n
@@ -1488,6 +1441,8 @@ function loopEventListener(target, type, useCapture, callback) {\n
             method = privateDeclarePublicGadget;\n
           } else if (options.sandbox === "iframe") {\n
             method = privateDeclareIframeGadget;\n
+          } else if (options.sandbox === "dataurl") {\n
+            method = privateDeclareDataUrlGadget;\n
           } else {\n
             throw new Error("Unsupported sandbox options \'" +\n
                             options.sandbox + "\'");\n
@@ -1600,8 +1555,7 @@ function loopEventListener(target, type, useCapture, callback) {\n
   /////////////////////////////////////////////////////////////////\n
   renderJS.getAbsoluteURL = function (url, base_url) {\n
     var doc, base, link,\n
-      html = "<!doctype><html><head></head></html>",\n
-      isAbsoluteOrDataURL = new RegExp(\'^(?:[a-z]+:)?//|data:\', \'i\');\n
+      html = "<!doctype><html><head></head></html>";\n
 \n
     if (url && base_url && !isAbsoluteOrDataURL.test(url)) {\n
       doc = (new DOMParser()).parseFromString(html, \'text/html\');\n
@@ -1679,10 +1633,9 @@ function loopEventListener(target, type, useCapture, callback) {\n
   // renderJS.declareGadgetKlass\n
   /////////////////////////////////////////////////////////////////\n
   renderJS.declareGadgetKlass = function (url) {\n
-    var result,\n
-      xhr;\n
+    var result;\n
 \n
-    function parse() {\n
+    function parse(xhr) {\n
       var tmp_constructor,\n
         key,\n
         parsed_html;\n
@@ -1707,8 +1660,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
         tmp_constructor.prototype.constructor = tmp_constructor;\n
         tmp_constructor.prototype.__path = url;\n
         tmp_constructor.prototype.__acquired_method_dict = {};\n
-        tmp_constructor.allowPublicAcquisition("pleasePublishMyState",\n
-                                               pleasePublishMyState);\n
         // https://developer.mozilla.org/en-US/docs/HTML_in_XMLHttpRequest\n
         // https://developer.mozilla.org/en-US/docs/Web/API/DOMParser\n
         // https://developer.mozilla.org/en-US/docs/Code_snippets/HTML_to_DOM\n
@@ -1729,51 +1680,19 @@ function loopEventListener(target, type, useCapture, callback) {\n
 \n
       return gadget_model_dict[url];\n
     }\n
-\n
-    function resolver(resolve, reject) {\n
-      function handler() {\n
-        var tmp_result;\n
-        try {\n
-          if (xhr.readyState === 0) {\n
-            // UNSENT\n
-            reject(xhr);\n
-          } else if (xhr.readyState === 4) {\n
-            // DONE\n
-            if ((xhr.status < 200) || (xhr.status >= 300) ||\n
-                (!/^text\\/html[;]?/.test(\n
-                  xhr.getResponseHeader("Content-Type") || ""\n
-                ))) {\n
-              reject(xhr);\n
-            } else {\n
-              tmp_result = parse();\n
-              resolve(tmp_result);\n
-            }\n
-          }\n
-        } catch (e) {\n
-          reject(e);\n
-        }\n
-      }\n
-\n
-      xhr = new XMLHttpRequest();\n
-      xhr.open("GET", url);\n
-      xhr.onreadystatechange = handler;\n
-      xhr.setRequestHeader(\'Accept\', \'text/html\');\n
-      xhr.withCredentials = true;\n
-      xhr.send();\n
-    }\n
-\n
-    function canceller() {\n
-      if ((xhr !== undefined) && (xhr.readyState !== xhr.DONE)) {\n
-        xhr.abort();\n
-      }\n
-    }\n
 \n
     if (gadget_model_dict.hasOwnProperty(url)) {\n
       // Return klass object if it already exists\n
       result = RSVP.resolve(gadget_model_dict[url]);\n
     } else {\n
       // Fetch the HTML page and parse it\n
-      result = new RSVP.Promise(resolver, canceller);\n
+      result = new RSVP.Queue()\n
+        .push(function () {\n
+          return ajax(url);\n
+        })\n
+        .push(function (xhr) {\n
+          return parse(xhr);\n
+        });\n
     }\n
     return result;\n
   };\n
@@ -1799,10 +1718,9 @@ function loopEventListener(target, type, useCapture, callback) {\n
         required_js_list: []\n
       },\n
       i,\n
-      element,\n
-      isAbsoluteURL = new RegExp(\'^(?:[a-z]+:)?//\', \'i\');\n
+      element;\n
 \n
-    if (!url || !isAbsoluteURL.test(url)) {\n
+    if (!url || !isAbsoluteOrDataURL.test(url)) {\n
       throw new Error("The url should be absolute: " + url);\n
     }\n
 \n
@@ -1851,39 +1769,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
   ///////////////////////////////////////////////////\n
   // Bootstrap process. Register the self gadget.\n
   ///////////////////////////////////////////////////\n
-\n
-  function mergeSubDict(dict) {\n
-    var subkey,\n
-      subkey2,\n
-      subresult2,\n
-      value,\n
-      result = {};\n
-    for (subkey in dict) {\n
-      if (dict.hasOwnProperty(subkey)) {\n
-        value = dict[subkey];\n
-        if (value instanceof Object) {\n
-          subresult2 = mergeSubDict(value);\n
-          for (subkey2 in subresult2) {\n
-            if (subresult2.hasOwnProperty(subkey2)) {\n
-              // XXX key should not have an . inside\n
-              if (result.hasOwnProperty(subkey + "." + subkey2)) {\n
-                throw new Error("Key " + subkey + "." +\n
-                                subkey2 + " already present");\n
-              }\n
-              result[subkey + "." + subkey2] = subresult2[subkey2];\n
-            }\n
-          }\n
-        } else {\n
-          if (result.hasOwnProperty(subkey)) {\n
-            throw new Error("Key " + subkey + " already present");\n
-          }\n
-          result[subkey] = value;\n
-        }\n
-      }\n
-    }\n
-    return result;\n
-\n
-  }\n
 \n
   function bootstrap() {\n
     var url = removeHash(window.location.href),\n
@@ -1911,26 +1796,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
         },\n
         reportServiceError: function (param_list) {\n
           letsCrash(param_list[0]);\n
-        },\n
-        pleaseRedirectMyHash: function (param_list) {\n
-          window.location.replace(param_list[0]);\n
-        },\n
-        pleasePublishMyState: function (param_list) {\n
-          var key,\n
-            first = true,\n
-            hash = "#";\n
-          param_list[0] = mergeSubDict(param_list[0]);\n
-          for (key in param_list[0]) {\n
-            if (param_list[0].hasOwnProperty(key)) {\n
-              if (!first) {\n
-                hash += "&";\n
-              }\n
-              hash += encodeURIComponent(key) + "=" +\n
-                encodeURIComponent(param_list[0][key]);\n
-              first = false;\n
-            }\n
-          }\n
-          return hash;\n
         }\n
       };\n
       // Stop acquisition on the last acquisition gadget\n
@@ -1971,10 +1836,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
 \n
         // Create the root gadget instance and put it in the loading stack\n
         root_gadget = new gadget_model_dict[url]();\n
-\n
-        tmp_constructor.declareService(function () {\n
-          return listenHashChange(this);\n
-        });\n
 \n
         setAqParent(root_gadget, last_acquisition_gadget);\n
 \n
@@ -2062,8 +1923,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
       }\n
 \n
       tmp_constructor.prototype.__acquired_method_dict = {};\n
-      tmp_constructor.allowPublicAcquisition("pleasePublishMyState",\n
-                                             pleasePublishMyState);\n
       gadget_loading_klass = tmp_constructor;\n
 \n
       function init() {\n
@@ -2216,9 +2075,6 @@ function loopEventListener(target, type, useCapture, callback) {\n
                   //we consider current gadget is parent gadget\n
                   //redifine last acquisition gadget\n
                   iframe_top_gadget = true;\n
-                  tmp_constructor.declareService(function () {\n
-                    return listenHashChange(this);\n
-                  });\n
                   setAqParent(root_gadget, last_acquisition_gadget);\n
                 } else {\n
                   throw error;\n
@@ -2267,7 +2123,8 @@ function loopEventListener(target, type, useCapture, callback) {\n
   }\n
   bootstrap();\n
 \n
-}(document, window, RSVP, DOMParser, Channel, MutationObserver, Node));
+}(document, window, RSVP, DOMParser, Channel, MutationObserver, Node,\n
+  FileReader, Blob));
 
 ]]></string> </value>
         </item>
@@ -2337,7 +2194,7 @@ function loopEventListener(target, type, useCapture, callback) {\n
             </item>
             <item>
                 <key> <string>actor</string> </key>
-                <value> <string>romain</string> </value>
+                <value> <string>cedric.le.ninivin</string> </value>
             </item>
             <item>
                 <key> <string>comment</string> </key>
@@ -2359,8 +2216,8 @@ function loopEventListener(target, type, useCapture, callback) {\n
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1406898405.75</float>
-                        <string>GMT</string>
+                        <float>1440175545.67</float>
+                        <string>UTC</string>
                       </tuple>
                     </state>
                   </object>
@@ -2390,7 +2247,7 @@ function loopEventListener(target, type, useCapture, callback) {\n
             </item>
             <item>
                 <key> <string>actor</string> </key>
-                <value> <string>super_sven</string> </value>
+                <value> <string>cedric.le.ninivin</string> </value>
             </item>
             <item>
                 <key> <string>comment</string> </key>
@@ -2404,7 +2261,7 @@ function loopEventListener(target, type, useCapture, callback) {\n
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>939.51246.32089.52411</string> </value>
+                <value> <string>945.18151.43412.19831</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -2422,8 +2279,8 @@ function loopEventListener(target, type, useCapture, callback) {\n
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1419342867.69</float>
-                        <string>GMT</string>
+                        <float>1440428114.52</float>
+                        <string>UTC</string>
                       </tuple>
                     </state>
                   </object>
@@ -2445,13 +2302,11 @@ function loopEventListener(target, type, useCapture, callback) {\n
           <dictionary>
             <item>
                 <key> <string>action</string> </key>
-                <value>
-                  <none/>
-                </value>
+                <value> <string>detect_converted_file</string> </value>
             </item>
             <item>
                 <key> <string>actor</string> </key>
-                <value> <string>romain</string> </value>
+                <value> <string>cedric.le.ninivin</string> </value>
             </item>
             <item>
                 <key> <string>comment</string> </key>
@@ -2463,7 +2318,7 @@ function loopEventListener(target, type, useCapture, callback) {\n
             </item>
             <item>
                 <key> <string>external_processing_state</string> </key>
-                <value> <string>empty</string> </value>
+                <value> <string>converted</string> </value>
             </item>
             <item>
                 <key> <string>serial</string> </key>
@@ -2481,8 +2336,8 @@ function loopEventListener(target, type, useCapture, callback) {\n
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1404995958.41</float>
-                        <string>GMT</string>
+                        <float>1440175328.89</float>
+                        <string>UTC</string>
                       </tuple>
                     </state>
                   </object>