diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.js
index a183afb69b40df16d5c2dadbec94e6d7e56e546a..0c3d4cc41386ecc157dfa930dcad587659314ecc 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_renderjs_js.js
@@ -670,21 +670,22 @@ if (typeof document.contains !== 'function') {
 
 /*
  * renderJs - Generic Gadget library renderer.
- * http://www.renderjs.org/documentation
+ * https://renderjs.nexedi.com/
  */
-(function (document, window, RSVP, DOMParser, Channel, MutationObserver,
-           Node, FileReader, Blob, navigator, Event, URL) {
+(function wrapRenderJS(document, window, RSVP, DOMParser, Channel,
+                       MutationObserver, Node, FileReader, Blob, navigator,
+                       Event, URL) {
   "use strict";
 
   function readBlobAsDataURL(blob) {
     var fr = new FileReader();
-    return new RSVP.Promise(function (resolve, reject) {
-      fr.addEventListener("load", function (evt) {
+    return new RSVP.Promise(function waitFormDataURLRead(resolve, reject) {
+      fr.addEventListener("load", function handleDataURLRead(evt) {
         resolve(evt.target.result);
       });
       fr.addEventListener("error", reject);
       fr.readAsDataURL(blob);
-    }, function () {
+    }, function cancelReadBlobAsDataURL() {
       fr.abort();
     });
   }
@@ -717,7 +718,7 @@ if (typeof document.contains !== 'function') {
     }
     function itsANonResolvableTrap(resolve, reject) {
       var result;
-      handle_event_callback = function (evt) {
+      handle_event_callback = function handleEventCallback(evt) {
         if (prevent_default) {
           evt.stopPropagation();
           evt.preventDefault();
@@ -733,10 +734,10 @@ if (typeof document.contains !== 'function') {
 
         callback_promise = result;
         new RSVP.Queue()
-          .push(function () {
+          .push(function waitForEventCallbackResult() {
             return result;
           })
-          .push(undefined, function (error) {
+          .push(undefined, function handleEventCallbackError(error) {
             if (!(error instanceof RSVP.CancellationError)) {
               canceller();
               reject(error);
@@ -814,11 +815,11 @@ if (typeof document.contains !== 'function') {
     error_list = [],
     all_dependency_loaded_deferred;
 
-  window.addEventListener('error', function (error) {
+  window.addEventListener('error', function handleGlobalError(error) {
     error_list.push(error);
   });
 
-  window.addEventListener('beforeunload', function () {
+  window.addEventListener('beforeunload', function handleBeforeUnload() {
     // XXX If another listener cancel the page unload,
     // it will not restore renderJS crash report
     is_page_unloaded = true;
@@ -961,12 +962,11 @@ if (typeof document.contains !== 'function') {
   ResolvedMonitorError.prototype = new Error();
   ResolvedMonitorError.prototype.constructor = ResolvedMonitorError;
 
-  Monitor = function () {
+  Monitor = function createMonitor() {
     var monitor = this,
       promise_list = [],
       promise,
       reject,
-      notify,
       resolved;
 
     if (!(this instanceof Monitor)) {
@@ -983,8 +983,8 @@ if (typeof document.contains !== 'function') {
       promise_list = [];
     }
 
-    promise = new RSVP.Promise(function (done, fail, progress) {
-      reject = function (rejectedReason) {
+    promise = new RSVP.Promise(function promiseMonitor(done, fail) {
+      reject = function rejectMonitor(rejectedReason) {
         if (resolved) {
           return;
         }
@@ -994,36 +994,31 @@ if (typeof document.contains !== 'function') {
         canceller();
         return fail(rejectedReason);
       };
-      notify = progress;
     }, canceller);
 
-    monitor.cancel = function () {
+    monitor.cancel = function cancelMonitor() {
       if (resolved) {
         return;
       }
       resolved = true;
       promise.cancel();
-      promise.fail(function (rejectedReason) {
+      promise.fail(function rejectMonitorPromise(rejectedReason) {
         monitor.isRejected = true;
         monitor.rejectedReason = rejectedReason;
       });
     };
-    monitor.then = function () {
-      return promise.then.apply(promise, arguments);
-    };
-    monitor.fail = function () {
-      return promise.fail.apply(promise, arguments);
-    };
+    monitor.then = promise.then.bind(promise);
+    monitor.fail = promise.fail.bind(promise);
 
-    monitor.monitor = function (promise_to_monitor) {
+    monitor.monitor = function startMonitor(promise_to_monitor) {
       if (resolved) {
         throw new ResolvedMonitorError();
       }
       var queue = new RSVP.Queue()
-        .push(function () {
+        .push(function waitForPromiseToMonitor() {
           return promise_to_monitor;
         })
-        .push(function (fulfillmentValue) {
+        .push(function handlePromiseToMonitorSuccess(fulfillmentValue) {
           // Promise to monitor is fullfilled, remove it from the list
           var len = promise_list.length,
             sub_promise_to_monitor,
@@ -1037,7 +1032,7 @@ if (typeof document.contains !== 'function') {
             }
           }
           promise_list = new_promise_list;
-        }, function (rejectedReason) {
+        }, function handlePromiseToMonitorError(rejectedReason) {
           if (rejectedReason instanceof RSVP.CancellationError) {
             if (!(promise_to_monitor.isFulfilled &&
                   promise_to_monitor.isRejected)) {
@@ -1047,9 +1042,6 @@ if (typeof document.contains !== 'function') {
           }
           reject(rejectedReason);
           throw rejectedReason;
-        }, function (notificationValue) {
-          notify(notificationValue);
-          return notificationValue;
         });
 
       promise_list.push(queue);
@@ -1076,7 +1068,7 @@ if (typeof document.contains !== 'function') {
   RenderJSGadget.prototype.__required_css_list = [];
   RenderJSGadget.prototype.__required_js_list = [];
 
-  function createMonitor(g) {
+  function createGadgetMonitor(g) {
     if (g.__monitor !== undefined) {
       g.__monitor.cancel();
     }
@@ -1084,19 +1076,17 @@ if (typeof document.contains !== 'function') {
     g.__job_dict = {};
     g.__job_list = [];
     g.__job_triggered = false;
-    g.__monitor.fail(function (error) {
+    g.__monitor.fail(function handleGadgetMonitorError(error) {
       if (!(error instanceof RSVP.CancellationError)) {
         return g.aq_reportServiceError(error);
       }
-    }).fail(function (error) {
-      // Crash the application if the acquisition generates an error.
-      return letsCrash(error);
-    });
+    // Crash the application if the acquisition generates an error.
+    }).fail(letsCrash);
   }
 
   function clearGadgetInternalParameters() {
     this.__sub_gadget_dict = {};
-    createMonitor(this);
+    createGadgetMonitor(this);
   }
 
   function loadSubGadgetDOMDeclaration() {
@@ -1110,7 +1100,7 @@ if (typeof document.contains !== 'function') {
       context = this;
 
     function prepareReportGadgetDeclarationError(scope) {
-      return function (error) {
+      return function reportGadgetDeclarationError(error) {
         var aq_dict = context.__acquired_method_dict || {},
           method_name = 'reportGadgetDeclarationError';
         if (aq_dict.hasOwnProperty(method_name)) {
@@ -1143,58 +1133,56 @@ if (typeof document.contains !== 'function') {
 
   RenderJSGadget.__ready_list = [clearGadgetInternalParameters,
                                  loadSubGadgetDOMDeclaration];
-  RenderJSGadget.ready = function (callback) {
+  RenderJSGadget.ready = function ready(callback) {
     this.__ready_list.push(callback);
     return this;
   };
-  RenderJSGadget.setState = function (state_dict) {
+  RenderJSGadget.setState = function setState(state_dict) {
     var json_state = JSON.stringify(state_dict);
-    this.__ready_list.unshift(function () {
+    this.__ready_list.unshift(function setStateDefaultValue() {
       this.state = JSON.parse(json_state);
     });
     return this;
   };
-  RenderJSGadget.onStateChange = function (callback) {
+  RenderJSGadget.onStateChange = function onStateChange(callback) {
     this.prototype.__state_change_callback = callback;
     return this;
   };
 
   RenderJSGadget.__service_list = [];
-  RenderJSGadget.declareService = function (callback) {
+  RenderJSGadget.declareService = function declareService(callback) {
     this.__service_list.push(callback);
     return this;
   };
-  RenderJSGadget.onEvent = function (type, callback, use_capture,
-                                     prevent_default) {
-    this.__service_list.push(function () {
+  RenderJSGadget.onEvent = function onEvent(type, callback, use_capture,
+                                            prevent_default) {
+    this.__service_list.push(function startLoopEventListenerService() {
       return loopEventListener(this.element, type, use_capture,
                                callback.bind(this), prevent_default);
     });
     return this;
   };
 
-  RenderJSGadget.onLoop = function (callback, delay) {
+  RenderJSGadget.onLoop = function onLoop(callback, delay) {
     if (delay === undefined) {
       delay = 0;
     }
-    this.__service_list.push(function () {
+    this.__service_list.push(function handleServiceCallback() {
       var queue_loop = new RSVP.Queue(),
         context = this,
-        wait = function () {
+        wait = function waitForLoopIteration() {
           queue_loop
-            .push(function () {
+            .push(function waitNextOnLoopDelay() {
               return RSVP.delay(delay);
             })
-            .push(function () {
+            .push(function waitNextOnLoopAnimationFrame() {
               // Only loop when the app has the focus
               return promiseAnimationFrame();
             })
-            .push(function () {
+            .push(function executeOnLoopCallback() {
               return callback.apply(context, []);
             })
-            .push(function () {
-              wait();
-            });
+            .push(wait);
         };
       wait();
       return queue_loop;
@@ -1204,7 +1192,7 @@ if (typeof document.contains !== 'function') {
 
   function runJob(gadget, name, callback, argument_list) {
     var job_promise = new RSVP.Queue()
-      .push(function () {
+      .push(function waitForJobCallback() {
         return callback.apply(gadget, argument_list);
       });
     if (gadget.__job_dict.hasOwnProperty(name)) {
@@ -1212,10 +1200,10 @@ if (typeof document.contains !== 'function') {
     }
     gadget.__job_dict[name] = job_promise;
     gadget.__monitor.monitor(new RSVP.Queue()
-      .push(function () {
+      .push(function waitForJobPromise() {
         return job_promise;
       })
-      .push(undefined, function (error) {
+      .push(undefined, function handleJobError(error) {
         if (!(error instanceof RSVP.CancellationError)) {
           throw error;
         }
@@ -1224,7 +1212,7 @@ if (typeof document.contains !== 'function') {
 
   function startService(gadget) {
     gadget.__monitor.monitor(new RSVP.Queue()
-      .push(function () {
+      .push(function monitorAllServiceList() {
         var i,
           service_list = gadget.constructor.__service_list,
           job_list = gadget.__job_list;
@@ -1245,8 +1233,8 @@ if (typeof document.contains !== 'function') {
   // gadget internal method, which trigger execution
   // of a function inside a service
   /////////////////////////////////////////////////////////////////
-  RenderJSGadget.declareJob = function (name, callback) {
-    this.prototype[name] = function () {
+  RenderJSGadget.declareJob = function declareJob(name, callback) {
+    this.prototype[name] = function triggerJob() {
       var context = this,
         argument_list = arguments;
 
@@ -1263,13 +1251,13 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // RenderJSGadget.declareMethod
   /////////////////////////////////////////////////////////////////
-  RenderJSGadget.declareMethod = function (name, callback) {
-    this.prototype[name] = function () {
+  RenderJSGadget.declareMethod = function declareMethod(name, callback) {
+    this.prototype[name] = function triggerMethod() {
       var context = this,
         argument_list = arguments;
 
       return new RSVP.Queue()
-        .push(function () {
+        .push(function waitForMethodCallback() {
           return callback.apply(context, argument_list);
         });
     };
@@ -1278,27 +1266,27 @@ if (typeof document.contains !== 'function') {
   };
 
   RenderJSGadget
-    .declareMethod('getInterfaceList', function () {
+    .declareMethod('getInterfaceList', function getInterfaceList() {
       // Returns the list of gadget prototype
       return this.__interface_list;
     })
-    .declareMethod('getRequiredCSSList', function () {
+    .declareMethod('getRequiredCSSList', function getRequiredCSSList() {
       // Returns a list of CSS required by the gadget
       return this.__required_css_list;
     })
-    .declareMethod('getRequiredJSList', function () {
+    .declareMethod('getRequiredJSList', function getRequiredJSList() {
       // Returns a list of JS required by the gadget
       return this.__required_js_list;
     })
-    .declareMethod('getPath', function () {
+    .declareMethod('getPath', function getPath() {
       // Returns the path of the code of a gadget
       return this.__path;
     })
-    .declareMethod('getTitle', function () {
+    .declareMethod('getTitle', function getTitle() {
       // Returns the title of a gadget
       return this.__title;
     })
-    .declareMethod('getElement', function () {
+    .declareMethod('getElement', function getElement() {
       // Returns the DOM Element of a gadget
       // XXX Kept for compatibility. Use element property directly
       if (this.element === undefined) {
@@ -1306,24 +1294,24 @@ if (typeof document.contains !== 'function') {
       }
       return this.element;
     })
-    .declareMethod('changeState', function (state_dict) {
+    .declareMethod('changeState', function changeState(state_dict) {
       var next_onStateChange = new RSVP.Queue(),
         previous_onStateCHange,
         context = this;
       if (context.hasOwnProperty('__previous_onStateChange')) {
         previous_onStateCHange = context.__previous_onStateChange;
         next_onStateChange
-          .push(function () {
+          .push(function waitForPreviousStateChange() {
             return previous_onStateCHange;
           })
-          .push(undefined, function () {
+          .push(undefined, function handlePreviousStateChangeError() {
             // Run callback even if previous failed
             return;
           });
       }
       context.__previous_onStateChange = next_onStateChange;
       return next_onStateChange
-        .push(function () {
+        .push(function checkStateModification() {
           var key,
             modified = false,
             previous_cancelled = context.hasOwnProperty('__modification_dict'),
@@ -1345,10 +1333,10 @@ if (typeof document.contains !== 'function') {
           if (modified && context.__state_change_callback !== undefined) {
             context.__modification_dict = modification_dict;
             return new RSVP.Queue()
-              .push(function () {
+              .push(function waitForStateChangeCallback() {
                 return context.__state_change_callback(modification_dict);
               })
-              .push(function (result) {
+              .push(function handleStateChangeSuccess(result) {
                 delete context.__modification_dict;
                 return result;
               });
@@ -1372,7 +1360,7 @@ if (typeof document.contains !== 'function') {
       }
     }
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForAcquireMethod() {
         // Do not specify default __acquired_method_dict on prototype
         // to prevent modifying this default value (with
         // allowPublicAcquiredMethod for example)
@@ -1383,7 +1371,7 @@ if (typeof document.contains !== 'function') {
         }
         throw new renderJS.AcquisitionError("aq_dynamic is not defined");
       })
-      .push(undefined, function (error) {
+      .push(undefined, function handleAcquireMethodError(error) {
         if (error instanceof renderJS.AcquisitionError) {
           return gadget.__aq_parent(method_name, argument_list);
         }
@@ -1392,12 +1380,12 @@ if (typeof document.contains !== 'function') {
   }
 
   RenderJSGadget.declareAcquiredMethod =
-    function (name, method_name_to_acquire) {
-      this.prototype[name] = function () {
+    function declareAcquiredMethod(name, method_name_to_acquire) {
+      this.prototype[name] = function acquireMethod() {
         var argument_list = Array.prototype.slice.call(arguments, 0),
           gadget = this;
         return new RSVP.Queue()
-          .push(function () {
+          .push(function waitForAqParent() {
             return gadget.__aq_parent(method_name_to_acquire, argument_list);
           });
       };
@@ -1414,7 +1402,7 @@ if (typeof document.contains !== 'function') {
   // RenderJSGadget.allowPublicAcquisition
   /////////////////////////////////////////////////////////////////
   RenderJSGadget.allowPublicAcquisition =
-    function (method_name, callback) {
+    function allowPublicAcquisition(method_name, callback) {
       this.prototype.__acquired_method_dict[method_name] = callback;
 
       // Allow chain
@@ -1423,10 +1411,11 @@ if (typeof document.contains !== 'function') {
 
   // Set aq_parent on gadget_instance which call acquire on parent_gadget
   function setAqParent(gadget_instance, parent_gadget) {
-    gadget_instance.__aq_parent = function (method_name, argument_list) {
-      return acquire.apply(parent_gadget, [gadget_instance, method_name,
-                                           argument_list]);
-    };
+    gadget_instance.__aq_parent =
+      function __aq_parent(method_name, argument_list) {
+        return acquire.apply(parent_gadget, [gadget_instance, method_name,
+                                             argument_list]);
+      };
   }
 
   /////////////////////////////////////////////////////////////////
@@ -1462,19 +1451,13 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   function privateDeclarePublicGadget(url, options, parent_gadget) {
 
-    return new RSVP.Queue()
-      .push(function () {
-        return renderJS.declareGadgetKlass(url)
-          // gadget loading should not be interrupted
-          // if not, gadget's definition will not be complete
-          //.then will return another promise
-          //so loading_klass_promise can't be cancel
-          .then(function (result) {
-            return result;
-          });
-      })
-      // Get the gadget class and instanciate it
-      .push(function (Klass) {
+    return renderJS.declareGadgetKlass(url)
+      // gadget loading should not be interrupted
+      // if not, gadget's definition will not be complete
+      //.then will return another promise
+      //so loading_klass_promise can't be cancel
+      .then(function createPrivateInstanceFromKlass(Klass) {
+        // Get the gadget class and instanciate it
         if (options.element === undefined) {
           options.element = document.createElement("div");
         }
@@ -1543,12 +1526,12 @@ if (typeof document.contains !== 'function') {
     gadget_instance = new RenderJSIframeGadget();
     setAqParent(gadget_instance, parent_gadget);
     iframe = document.createElement("iframe");
-    iframe.addEventListener('error', function (error) {
+    iframe.addEventListener('error', function handleIframeError(error) {
       iframe_loading_deferred.reject(error);
     });
-    iframe.addEventListener('load', function () {
+    iframe.addEventListener('load', function handleIframeLoad() {
       return RSVP.timeout(5000)
-        .fail(function () {
+        .fail(function triggerIframeTimeout() {
           iframe_loading_deferred.reject(
             new Error('Timeout while loading: ' + url)
           );
@@ -1573,46 +1556,51 @@ if (typeof document.contains !== 'function') {
     });
 
     // Create new method from the declareMethod call inside the iframe
-    gadget_instance.__chan.bind("declareMethod",
-                                function (trans, method_name) {
-        gadget_instance[method_name] = function () {
+    gadget_instance.__chan.bind(
+      "declareMethod",
+      function handleChannelDeclareMethod(trans, method_name) {
+        gadget_instance[method_name] = function triggerChannelDeclareMethod() {
           var argument_list = arguments,
-            wait_promise = new RSVP.Promise(function (resolve, reject) {
-              gadget_instance.__chan.call({
-                method: "methodCall",
-                params: [
-                  method_name,
-                  Array.prototype.slice.call(argument_list, 0)],
-                success: resolve,
-                error: reject
-              });
-            });
+            wait_promise = new RSVP.Promise(
+              function handleChannelCall(resolve, reject) {
+                gadget_instance.__chan.call({
+                  method: "methodCall",
+                  params: [
+                    method_name,
+                    Array.prototype.slice.call(argument_list, 0)],
+                  success: resolve,
+                  error: reject
+                });
+              }
+            );
           return new RSVP.Queue()
-            .push(function () {
+            .push(function waitForChannelCall() {
               return wait_promise;
             });
         };
         return "OK";
-      });
+      }
+    );
 
     // Wait for the iframe to be loaded before continuing
-    gadget_instance.__chan.bind("ready", function (trans) {
+    gadget_instance.__chan.bind("ready", function handleChannelReady(trans) {
       iframe_loading_deferred.resolve(gadget_instance);
       return "OK";
     });
-    gadget_instance.__chan.bind("failed", function (trans, params) {
-      iframe_loading_deferred.reject(params);
-      return "OK";
-    });
-    gadget_instance.__chan.bind("acquire", function (trans, params) {
-      gadget_instance.__aq_parent.apply(gadget_instance, params)
-        .then(function (g) {
-          trans.complete(g);
-        }).fail(function (e) {
-          trans.error(e.toString());
-        });
-      trans.delayReturn(true);
-    });
+    gadget_instance.__chan.bind("failed",
+                                function handleChannelFail(trans, params) {
+        iframe_loading_deferred.reject(params);
+        return "OK";
+      });
+    gadget_instance.__chan.bind("acquire",
+                                function handleChannelAcquire(trans, params) {
+        gadget_instance.__aq_parent.apply(gadget_instance, params)
+          .then(trans.complete)
+          .fail(function handleChannelAcquireError(e) {
+            trans.error(e.toString());
+          });
+        trans.delayReturn(true);
+      });
 
     return iframe_loading_deferred.promise;
   }
@@ -1623,10 +1611,10 @@ if (typeof document.contains !== 'function') {
   function privateDeclareDataUrlGadget(url, options, parent_gadget) {
 
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForDataUrlAjax() {
         return ajax(url);
       })
-      .push(function (xhr) {
+      .push(function handleDataURLAjaxResponse(xhr) {
         // Insert a "base" element, in order to resolve all relative links
         // which could get broken with a data url
         var doc = (new DOMParser()).parseFromString(xhr.responseText,
@@ -1639,7 +1627,7 @@ if (typeof document.contains !== 'function') {
                         {type: "text/html;charset=UTF-8"});
         return readBlobAsDataURL(blob);
       })
-      .push(function (data_url) {
+      .push(function handleDataURL(data_url) {
         return privateDeclareIframeGadget(data_url, options, parent_gadget);
       });
   }
@@ -1648,7 +1636,7 @@ if (typeof document.contains !== 'function') {
   // RenderJSGadget.declareGadget
   /////////////////////////////////////////////////////////////////
   RenderJSGadget
-    .declareMethod('declareGadget', function (url, options) {
+    .declareMethod('declareGadget', function declareGadget(url, options) {
       var parent_gadget = this;
 
       if (options === undefined) {
@@ -1662,7 +1650,7 @@ if (typeof document.contains !== 'function') {
       url = renderJS.getAbsoluteURL(url, this.__path);
 
       return new RSVP.Queue()
-        .push(function () {
+        .push(function waitForPrivateDeclareGadget() {
           var method;
           if (options.sandbox === "public") {
             method = privateDeclarePublicGadget;
@@ -1677,7 +1665,7 @@ if (typeof document.contains !== 'function') {
           return method(url, options, parent_gadget);
         })
         // Set the HTML context
-        .push(function (gadget_instance) {
+        .push(function setGadgetInstanceHTMLContext(gadget_instance) {
           var i,
             scope,
             queue = new RSVP.Queue();
@@ -1686,7 +1674,7 @@ if (typeof document.contains !== 'function') {
             return gadget_instance;
           }
           function ready_executable_wrapper(fct) {
-            return function () {
+            return function executeReadyWrapper() {
               return fct.call(gadget_instance, gadget_instance);
             };
           }
@@ -1730,13 +1718,14 @@ if (typeof document.contains !== 'function') {
           return queue;
         });
     })
-    .declareMethod('getDeclaredGadget', function (gadget_scope) {
-      if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {
-        throw new Error("Gadget scope '" + gadget_scope + "' is not known.");
-      }
-      return this.__sub_gadget_dict[gadget_scope];
-    })
-    .declareMethod('dropGadget', function (gadget_scope) {
+    .declareMethod('getDeclaredGadget',
+      function getDeclaredGadget(gadget_scope) {
+        if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {
+          throw new Error("Gadget scope '" + gadget_scope + "' is not known.");
+        }
+        return this.__sub_gadget_dict[gadget_scope];
+      })
+    .declareMethod('dropGadget', function dropGadget(gadget_scope) {
       if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {
         throw new Error("Gadget scope '" + gadget_scope + "' is not known.");
       }
@@ -1747,7 +1736,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS selector
   /////////////////////////////////////////////////////////////////
-  renderJS = function (selector) {
+  renderJS = function getLoadingGadget(selector) {
     var result;
     if (selector === window) {
       // window is the 'this' value when loading a javascript file
@@ -1763,7 +1752,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.AcquisitionError
   /////////////////////////////////////////////////////////////////
-  renderJS.AcquisitionError = function (message) {
+  renderJS.AcquisitionError = function createAcquisitionError(message) {
     this.name = "AcquisitionError";
     if ((message !== undefined) && (typeof message !== "string")) {
       throw new TypeError('You must pass a string.');
@@ -1777,7 +1766,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.getAbsoluteURL
   /////////////////////////////////////////////////////////////////
-  renderJS.getAbsoluteURL = function (url, base_url) {
+  renderJS.getAbsoluteURL = function getAbsoluteURL(url, base_url) {
     if (base_url && url) {
       return new URL(url, base_url).href;
     }
@@ -1787,7 +1776,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.declareJS
   /////////////////////////////////////////////////////////////////
-  renderJS.declareJS = function (url, container, pop) {
+  renderJS.declareJS = function declareJS(url, container, pop) {
     // https://www.html5rocks.com/en/tutorials/speed/script-loading/
     // Prevent infinite recursion if loading render.js
     // more than once
@@ -1796,28 +1785,30 @@ if (typeof document.contains !== 'function') {
       result = RSVP.resolve();
     } else {
       javascript_registration_dict[url] = null;
-      result = new RSVP.Promise(function (resolve, reject) {
-        var newScript;
-        newScript = document.createElement('script');
-        newScript.async = false;
-        newScript.type = 'text/javascript';
-        newScript.onload = function () {
-          if (pop === true) {
-            // Drop the current loading klass info used by selector
-            gadget_loading_klass_list.shift();
-          }
-          resolve();
-        };
-        newScript.onerror = function (e) {
-          if (pop === true) {
-            // Drop the current loading klass info used by selector
-            gadget_loading_klass_list.shift();
-          }
-          reject(e);
-        };
-        newScript.src = url;
-        container.appendChild(newScript);
-      });
+      result = new RSVP.Promise(
+        function waitForJSLoadEvent(resolve, reject) {
+          var newScript;
+          newScript = document.createElement('script');
+          newScript.async = false;
+          newScript.type = 'text/javascript';
+          newScript.onload = function triggerJSLoaded() {
+            if (pop === true) {
+              // Drop the current loading klass info used by selector
+              gadget_loading_klass_list.shift();
+            }
+            resolve();
+          };
+          newScript.onerror = function triggerJSNotLoaded(e) {
+            if (pop === true) {
+              // Drop the current loading klass info used by selector
+              gadget_loading_klass_list.shift();
+            }
+            reject(e);
+          };
+          newScript.src = url;
+          container.appendChild(newScript);
+        }
+      );
     }
     return result;
   };
@@ -1825,7 +1816,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.declareCSS
   /////////////////////////////////////////////////////////////////
-  renderJS.declareCSS = function (url, container) {
+  renderJS.declareCSS = function declareCSS(url, container) {
     // https://github.com/furf/jquery-getCSS/blob/master/jquery.getCSS.js
     // No way to cleanly check if a css has been loaded
     // So, always resolve the promise...
@@ -1834,19 +1825,17 @@ if (typeof document.contains !== 'function') {
     if (stylesheet_registration_dict.hasOwnProperty(url)) {
       result = RSVP.resolve();
     } else {
-      result = new RSVP.Promise(function (resolve, reject) {
+      result = new RSVP.Promise(function waitForCSSLoadEvent(resolve, reject) {
         var link;
         link = document.createElement('link');
         link.rel = 'stylesheet';
         link.type = 'text/css';
         link.href = url;
-        link.onload = function () {
+        link.onload = function triggerCSSLoaded() {
           stylesheet_registration_dict[url] = null;
           resolve();
         };
-        link.onerror = function (e) {
-          reject(e);
-        };
+        link.onerror = reject;
         container.appendChild(link);
       });
     }
@@ -1862,7 +1851,7 @@ if (typeof document.contains !== 'function') {
       key,
       parsed_html;
     // Class inheritance
-    tmp_constructor = function () {
+    tmp_constructor = function createSuperKlass() {
       RenderJSGadget.call(this);
     };
     tmp_constructor.__ready_list = RenderJSGadget.__ready_list.slice();
@@ -1908,23 +1897,35 @@ if (typeof document.contains !== 'function') {
     return tmp_constructor;
   }
 
-  renderJS.declareGadgetKlass = function (url) {
+  renderJS.declareGadgetKlass = function declareGadgetKlass(url) {
+    var tmp_constructor,
+      defer;
+
     if (gadget_model_defer_dict.hasOwnProperty(url)) {
       // Return klass object if it already exists
-      return gadget_model_defer_dict[url].promise;
+      if (gadget_model_defer_dict[url].hasOwnProperty('defer_list')) {
+        // Klass not yet loaded.
+        // Add a new defer
+        defer = RSVP.defer();
+        gadget_model_defer_dict[url].defer_list.push(defer);
+        return defer.promise;
+      }
+      if (gadget_model_defer_dict[url].is_resolved) {
+        return RSVP.resolve(gadget_model_defer_dict[url].result);
+      }
+      return RSVP.reject(gadget_model_defer_dict[url].result);
     }
 
-    var tmp_constructor,
-      defer = RSVP.defer();
-
-    gadget_model_defer_dict[url] = defer;
+    gadget_model_defer_dict[url] = {
+      defer_list: []
+    };
 
     // Fetch the HTML page and parse it
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForGadgetKlassAjax() {
         return ajax(url);
       })
-      .push(function (result) {
+      .push(function handleGadgetKlassAjax(result) {
         tmp_constructor = parse(result, url);
         var fragment = document.createDocumentFragment(),
           promise_list = [],
@@ -1946,14 +1947,28 @@ if (typeof document.contains !== 'function') {
         document.head.appendChild(fragment);
         return RSVP.all(promise_list);
       })
-      .push(function () {
-        defer.resolve(tmp_constructor);
+      .push(function handleGadgetKlassLoadingSuccess() {
+        var i,
+          len = gadget_model_defer_dict[url].defer_list.length;
+        for (i = 0; i < len; i += 1) {
+          gadget_model_defer_dict[url].defer_list[i].resolve(tmp_constructor);
+        }
+        delete gadget_model_defer_dict[url].defer_list;
+        gadget_model_defer_dict[url].result = tmp_constructor;
+        gadget_model_defer_dict[url].is_resolved = true;
         return tmp_constructor;
       })
-      .push(undefined, function (e) {
+      .push(undefined, function handleGadgetKlassLoadingError(e) {
         // Drop the current loading klass info used by selector
         // even in case of error
-        defer.reject(e);
+        var i,
+          len = gadget_model_defer_dict[url].defer_list.length;
+        for (i = 0; i < len; i += 1) {
+          gadget_model_defer_dict[url].defer_list[i].reject(e);
+        }
+        delete gadget_model_defer_dict[url].defer_list;
+        gadget_model_defer_dict[url].result = e;
+        gadget_model_defer_dict[url].is_resolved = false;
         throw e;
       });
   };
@@ -1962,7 +1977,7 @@ if (typeof document.contains !== 'function') {
   // renderJS.clearGadgetKlassList
   /////////////////////////////////////////////////////////////////
   // For test purpose only
-  renderJS.clearGadgetKlassList = function () {
+  renderJS.clearGadgetKlassList = function clearGadgetKlassList() {
     gadget_model_defer_dict = {};
     javascript_registration_dict = {};
     stylesheet_registration_dict = {};
@@ -1971,53 +1986,54 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.parseGadgetHTMLDocument
   /////////////////////////////////////////////////////////////////
-  renderJS.parseGadgetHTMLDocument = function (document_element, url) {
-    var settings = {
-        title: "",
-        interface_list: [],
-        required_css_list: [],
-        required_js_list: []
-      },
-      i,
-      element;
-
-    if (!url || !isAbsoluteOrDataURL.test(url)) {
-      throw new Error("The url should be absolute: " + url);
-    }
+  renderJS.parseGadgetHTMLDocument =
+    function parseGadgetHTMLDocument(document_element, url) {
+      var settings = {
+          title: "",
+          interface_list: [],
+          required_css_list: [],
+          required_js_list: []
+        },
+        i,
+        element;
+
+      if (!url || !isAbsoluteOrDataURL.test(url)) {
+        throw new Error("The url should be absolute: " + url);
+      }
 
-    if (document_element.nodeType === 9) {
-      settings.title = document_element.title;
-
-      if (document_element.head !== null) {
-        for (i = 0; i < document_element.head.children.length; i += 1) {
-          element = document_element.head.children[i];
-          if (element.href !== null) {
-            // XXX Manage relative URL during extraction of URLs
-            // element.href returns absolute URL in firefox but "" in chrome;
-            if (element.rel === "stylesheet") {
-              settings.required_css_list.push(
-                renderJS.getAbsoluteURL(element.getAttribute("href"), url)
-              );
-            } else if (element.nodeName === "SCRIPT" &&
-                       (element.type === "text/javascript" ||
-                        !element.type)) {
-              settings.required_js_list.push(
-                renderJS.getAbsoluteURL(element.getAttribute("src"), url)
-              );
-            } else if (element.rel ===
-                       "http://www.renderjs.org/rel/interface") {
-              settings.interface_list.push(
-                renderJS.getAbsoluteURL(element.getAttribute("href"), url)
-              );
+      if (document_element.nodeType === 9) {
+        settings.title = document_element.title;
+
+        if (document_element.head !== null) {
+          for (i = 0; i < document_element.head.children.length; i += 1) {
+            element = document_element.head.children[i];
+            if (element.href !== null) {
+              // XXX Manage relative URL during extraction of URLs
+              // element.href returns absolute URL in firefox but "" in chrome;
+              if (element.rel === "stylesheet") {
+                settings.required_css_list.push(
+                  renderJS.getAbsoluteURL(element.getAttribute("href"), url)
+                );
+              } else if (element.nodeName === "SCRIPT" &&
+                         (element.type === "text/javascript" ||
+                          !element.type)) {
+                settings.required_js_list.push(
+                  renderJS.getAbsoluteURL(element.getAttribute("src"), url)
+                );
+              } else if (element.rel ===
+                         "http://www.renderjs.org/rel/interface") {
+                settings.interface_list.push(
+                  renderJS.getAbsoluteURL(element.getAttribute("href"), url)
+                );
+              }
             }
           }
         }
+      } else {
+        throw new Error("The first parameter should be an HTMLDocument");
       }
-    } else {
-      throw new Error("The first parameter should be an HTMLDocument");
-    }
-    return settings;
-  };
+      return settings;
+    };
 
   /////////////////////////////////////////////////////////////////
   // global
@@ -2037,7 +2053,7 @@ if (typeof document.contains !== 'function') {
   // is triggered before everything was ready.
   // (For instance, the HTML-tag for the self gadget gets inserted after
   //  page load)
-  renderJS.manualBootstrap = function () {
+  renderJS.manualBootstrap = function manualBootstrap() {
     all_dependency_loaded_deferred.resolve();
   };
   document.addEventListener('DOMContentLoaded',
@@ -2065,7 +2081,7 @@ if (typeof document.contains !== 'function') {
     TmpConstructor.__template_element.appendChild(fragment);
     return RSVP.all([root_gadget.getRequiredJSList(),
               root_gadget.getRequiredCSSList()])
-      .then(function (all_list) {
+      .then(function handleRequireDependencyList(all_list) {
         var i,
           js_list = all_list[0],
           css_list = all_list[1];
@@ -2076,14 +2092,14 @@ if (typeof document.contains !== 'function') {
           stylesheet_registration_dict[css_list[i]] = null;
         }
         gadget_loading_klass_list.shift();
-      }).then(function () {
+      }).then(function createMutationObserver() {
 
         // select the target node
         var target = document.querySelector('body'),
           // create an observer instance
-          observer = new MutationObserver(function (mutations) {
+          observer = new MutationObserver(function observeMutatios(mutations) {
             var i, k, len, len2, node, added_list;
-            mutations.forEach(function (mutation) {
+            mutations.forEach(function observerMutation(mutation) {
               if (mutation.type === 'childList') {
 
                 len = mutation.removedNodes.length;
@@ -2092,7 +2108,7 @@ if (typeof document.contains !== 'function') {
                   if (node.nodeType === Node.ELEMENT_NODE) {
                     if (node.hasAttribute("data-gadget-url") &&
                         (node._gadget !== undefined)) {
-                      createMonitor(node._gadget);
+                      createGadgetMonitor(node._gadget);
                     }
                     added_list =
                       node.querySelectorAll("[data-gadget-url]");
@@ -2100,7 +2116,7 @@ if (typeof document.contains !== 'function') {
                     for (k = 0; k < len2; k += 1) {
                       node = added_list[k];
                       if (node._gadget !== undefined) {
-                        createMonitor(node._gadget);
+                        createGadgetMonitor(node._gadget);
                       }
                     }
                   }
@@ -2151,13 +2167,13 @@ if (typeof document.contains !== 'function') {
   function createLastAcquisitionGadget() {
     var last_acquisition_gadget = new RenderJSGadget();
     last_acquisition_gadget.__acquired_method_dict = {
-      reportServiceError: function (param_list) {
+      reportServiceError: function reportServiceError(param_list) {
         letsCrash(param_list[0]);
       }
     };
     // Stop acquisition on the last acquisition gadget
     // Do not put this on the klass, as their could be multiple instances
-    last_acquisition_gadget.__aq_parent = function (method_name) {
+    last_acquisition_gadget.__aq_parent = function __aq_parent(method_name) {
       throw new renderJS.AcquisitionError(
         "No gadget provides " + method_name
       );
@@ -2205,7 +2221,7 @@ if (typeof document.contains !== 'function') {
     ];
 
     // Inform parent gadget about declareMethod calls here.
-    notifyDeclareMethod = function (name) {
+    notifyDeclareMethod = function notifyDeclareMethod(name) {
       declare_method_list_waiting.push(name);
     };
 
@@ -2218,13 +2234,13 @@ if (typeof document.contains !== 'function') {
       loading_result = RSVP.any([
         channel_defer.promise,
         new RSVP.Queue()
-          .push(function () {
+          .push(function waitForParentChannelCreation() {
             // Expect the channel to parent to be usable after 1 second
             // If not, consider the gadget as the root
             // Drop all iframe channel communication
             return RSVP.delay(1000);
           })
-          .push(function () {
+          .push(function handleParentChannelCreation() {
             real_result_list[2] = undefined;
             return real_result_list;
           })
@@ -2234,20 +2250,22 @@ if (typeof document.contains !== 'function') {
         window: window.parent,
         origin: "*",
         scope: "renderJS",
-        onReady: function () {
+        onReady: function onChannelReady() {
           var k,
             len;
           // Channel is ready, so now declare all methods
-          notifyDeclareMethod = function (name) {
+          notifyDeclareMethod = function notifyDeclareMethod(name) {
             declare_method_list_waiting.push(
-              new RSVP.Promise(function (resolve, reject) {
-                embedded_channel.call({
-                  method: "declareMethod",
-                  params: name,
-                  success: resolve,
-                  error: reject
-                });
-              })
+              new RSVP.Promise(
+                function promiseChannelDeclareMethodCall(resolve, reject) {
+                  embedded_channel.call({
+                    method: "declareMethod",
+                    params: name,
+                    success: resolve,
+                    error: reject
+                  });
+                }
+              )
             );
           };
 
@@ -2263,7 +2281,7 @@ if (typeof document.contains !== 'function') {
     }
 
     // Surcharge declareMethod to inform parent window
-    TmpConstructor.declareMethod = function (name, callback) {
+    TmpConstructor.declareMethod = function declareMethod(name, callback) {
       var result = RenderJSGadget.declareMethod.apply(
           this,
           [name, callback]
@@ -2300,11 +2318,11 @@ if (typeof document.contains !== 'function') {
       return root_gadget;
     }
     function ready_executable_wrapper(fct) {
-      return function (g) {
+      return function wrapReadyFunction(g) {
         return fct.call(g, g);
       };
     }
-    TmpConstructor.ready(function () {
+    TmpConstructor.ready(function startServiceInReady() {
       return startService(this);
     });
 
@@ -2323,35 +2341,32 @@ if (typeof document.contains !== 'function') {
                                        embedded_channel) {
     // Define __aq_parent to inform parent window
     root_gadget.__aq_parent =
-      TmpConstructor.prototype.__aq_parent = function (method_name,
-                                                       argument_list,
-                                                       time_out) {
-        return new RSVP.Promise(function (resolve, reject) {
-          embedded_channel.call({
-            method: "acquire",
-            params: [
-              method_name,
-              argument_list
-            ],
-            success: function (s) {
-              resolve(s);
-            },
-            error: function (e) {
-              reject(e);
-            },
-            timeout: time_out
-          });
-        });
+      TmpConstructor.prototype.__aq_parent = function aq_parent(method_name,
+                                                                argument_list,
+                                                                time_out) {
+        return new RSVP.Promise(
+          function waitForChannelAcquire(resolve, reject) {
+            embedded_channel.call({
+              method: "acquire",
+              params: [
+                method_name,
+                argument_list
+              ],
+              success: resolve,
+              error: reject,
+              timeout: time_out
+            });
+          }
+        );
       };
 
     // bind calls to renderJS method on the instance
-    embedded_channel.bind("methodCall", function (trans, v) {
+    embedded_channel.bind("methodCall", function methodCall(trans, v) {
       root_gadget[v[0]].apply(root_gadget, v[1])
-        .push(function (g) {
-          trans.complete(g);
-        }, function (e) {
-          trans.error(e.toString());
-        });
+        .push(trans.complete,
+          function handleMethodCallError(e) {
+            trans.error(e.toString());
+          });
       trans.delayReturn(true);
     });
   }
@@ -2365,11 +2380,11 @@ if (typeof document.contains !== 'function') {
       declare_method_list_waiting;
 
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForLoadingGadget() {
         // Wait for the loading gadget to be created
         return wait_for_gadget_loaded;
       })
-      .push(function (result_list) {
+      .push(function handleLoadingGadget(result_list) {
         TmpConstructor = result_list[0];
         root_gadget = result_list[1];
         embedded_channel = result_list[2];
@@ -2377,11 +2392,11 @@ if (typeof document.contains !== 'function') {
         // Wait for all the gadget dependencies to be loaded
         return all_dependency_loaded_deferred.promise;
       })
-      .push(function () {
+      .push(function waitForDeclareMethodList() {
         // Wait for all methods to be correctly declared
         return RSVP.all(declare_method_list_waiting);
       })
-      .push(function (result_list) {
+      .push(function waitForMutationObserver(result_list) {
         if (embedded_channel !== undefined) {
           finishAqParentConfiguration(TmpConstructor, root_gadget,
                                       embedded_channel);
@@ -2389,16 +2404,16 @@ if (typeof document.contains !== 'function') {
         // Check all DOM modifications to correctly start/stop services
         return configureMutationObserver(TmpConstructor, url, root_gadget);
       })
-      .push(function () {
+      .push(function waitForReadyList() {
         // Trigger all ready functions
         return triggerReadyList(TmpConstructor, root_gadget);
       })
-      .push(function () {
+      .push(function notifyReady() {
         if (embedded_channel !== undefined) {
           embedded_channel.notify({method: "ready"});
         }
       })
-      .push(undefined, function (e) {
+      .push(undefined, function handleBootstrapError(e) {
         letsCrash(e);
         if (embedded_channel !== undefined) {
           embedded_channel.notify({method: "failed", params: e.toString()});
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 3d1d6c10562a3cc3a41a205fdf162ed9c9c10bc8..2bf92012d2c30c4380682105f3f22763a8f9891b 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
@@ -230,7 +230,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>961.58176.38662.18807</string> </value>
+                <value> <string>962.24020.58652.57139</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -248,7 +248,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1505981711.78</float>
+                        <float>1508945098.52</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/renderjs.js.js b/product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/renderjs.js.js
index 2ab05d259b7f82ca93bdec1462a2b2e476e19b7f..0c3d4cc41386ecc157dfa930dcad587659314ecc 100644
--- a/product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/renderjs.js.js
+++ b/product/ERP5/bootstrap/erp5_xhtml_style/SkinTemplateItem/portal_skins/erp5_xhtml_style/renderjs.js.js
@@ -670,21 +670,22 @@ if (typeof document.contains !== 'function') {
 
 /*
  * renderJs - Generic Gadget library renderer.
- * http://www.renderjs.org/documentation
+ * https://renderjs.nexedi.com/
  */
-(function (document, window, RSVP, DOMParser, Channel, MutationObserver,
-           Node, FileReader, Blob, navigator, Event, URL) {
+(function wrapRenderJS(document, window, RSVP, DOMParser, Channel,
+                       MutationObserver, Node, FileReader, Blob, navigator,
+                       Event, URL) {
   "use strict";
 
   function readBlobAsDataURL(blob) {
     var fr = new FileReader();
-    return new RSVP.Promise(function (resolve, reject) {
-      fr.addEventListener("load", function (evt) {
+    return new RSVP.Promise(function waitFormDataURLRead(resolve, reject) {
+      fr.addEventListener("load", function handleDataURLRead(evt) {
         resolve(evt.target.result);
       });
       fr.addEventListener("error", reject);
       fr.readAsDataURL(blob);
-    }, function () {
+    }, function cancelReadBlobAsDataURL() {
       fr.abort();
     });
   }
@@ -717,7 +718,7 @@ if (typeof document.contains !== 'function') {
     }
     function itsANonResolvableTrap(resolve, reject) {
       var result;
-      handle_event_callback = function (evt) {
+      handle_event_callback = function handleEventCallback(evt) {
         if (prevent_default) {
           evt.stopPropagation();
           evt.preventDefault();
@@ -733,10 +734,10 @@ if (typeof document.contains !== 'function') {
 
         callback_promise = result;
         new RSVP.Queue()
-          .push(function () {
+          .push(function waitForEventCallbackResult() {
             return result;
           })
-          .push(undefined, function (error) {
+          .push(undefined, function handleEventCallbackError(error) {
             if (!(error instanceof RSVP.CancellationError)) {
               canceller();
               reject(error);
@@ -814,11 +815,11 @@ if (typeof document.contains !== 'function') {
     error_list = [],
     all_dependency_loaded_deferred;
 
-  window.addEventListener('error', function (error) {
+  window.addEventListener('error', function handleGlobalError(error) {
     error_list.push(error);
   });
 
-  window.addEventListener('beforeunload', function () {
+  window.addEventListener('beforeunload', function handleBeforeUnload() {
     // XXX If another listener cancel the page unload,
     // it will not restore renderJS crash report
     is_page_unloaded = true;
@@ -961,12 +962,11 @@ if (typeof document.contains !== 'function') {
   ResolvedMonitorError.prototype = new Error();
   ResolvedMonitorError.prototype.constructor = ResolvedMonitorError;
 
-  Monitor = function () {
+  Monitor = function createMonitor() {
     var monitor = this,
       promise_list = [],
       promise,
       reject,
-      notify,
       resolved;
 
     if (!(this instanceof Monitor)) {
@@ -983,8 +983,8 @@ if (typeof document.contains !== 'function') {
       promise_list = [];
     }
 
-    promise = new RSVP.Promise(function (done, fail, progress) {
-      reject = function (rejectedReason) {
+    promise = new RSVP.Promise(function promiseMonitor(done, fail) {
+      reject = function rejectMonitor(rejectedReason) {
         if (resolved) {
           return;
         }
@@ -994,36 +994,31 @@ if (typeof document.contains !== 'function') {
         canceller();
         return fail(rejectedReason);
       };
-      notify = progress;
     }, canceller);
 
-    monitor.cancel = function () {
+    monitor.cancel = function cancelMonitor() {
       if (resolved) {
         return;
       }
       resolved = true;
       promise.cancel();
-      promise.fail(function (rejectedReason) {
+      promise.fail(function rejectMonitorPromise(rejectedReason) {
         monitor.isRejected = true;
         monitor.rejectedReason = rejectedReason;
       });
     };
-    monitor.then = function () {
-      return promise.then.apply(promise, arguments);
-    };
-    monitor.fail = function () {
-      return promise.fail.apply(promise, arguments);
-    };
+    monitor.then = promise.then.bind(promise);
+    monitor.fail = promise.fail.bind(promise);
 
-    monitor.monitor = function (promise_to_monitor) {
+    monitor.monitor = function startMonitor(promise_to_monitor) {
       if (resolved) {
         throw new ResolvedMonitorError();
       }
       var queue = new RSVP.Queue()
-        .push(function () {
+        .push(function waitForPromiseToMonitor() {
           return promise_to_monitor;
         })
-        .push(function (fulfillmentValue) {
+        .push(function handlePromiseToMonitorSuccess(fulfillmentValue) {
           // Promise to monitor is fullfilled, remove it from the list
           var len = promise_list.length,
             sub_promise_to_monitor,
@@ -1037,7 +1032,7 @@ if (typeof document.contains !== 'function') {
             }
           }
           promise_list = new_promise_list;
-        }, function (rejectedReason) {
+        }, function handlePromiseToMonitorError(rejectedReason) {
           if (rejectedReason instanceof RSVP.CancellationError) {
             if (!(promise_to_monitor.isFulfilled &&
                   promise_to_monitor.isRejected)) {
@@ -1047,9 +1042,6 @@ if (typeof document.contains !== 'function') {
           }
           reject(rejectedReason);
           throw rejectedReason;
-        }, function (notificationValue) {
-          notify(notificationValue);
-          return notificationValue;
         });
 
       promise_list.push(queue);
@@ -1076,7 +1068,7 @@ if (typeof document.contains !== 'function') {
   RenderJSGadget.prototype.__required_css_list = [];
   RenderJSGadget.prototype.__required_js_list = [];
 
-  function createMonitor(g) {
+  function createGadgetMonitor(g) {
     if (g.__monitor !== undefined) {
       g.__monitor.cancel();
     }
@@ -1084,19 +1076,17 @@ if (typeof document.contains !== 'function') {
     g.__job_dict = {};
     g.__job_list = [];
     g.__job_triggered = false;
-    g.__monitor.fail(function (error) {
+    g.__monitor.fail(function handleGadgetMonitorError(error) {
       if (!(error instanceof RSVP.CancellationError)) {
         return g.aq_reportServiceError(error);
       }
-    }).fail(function (error) {
-      // Crash the application if the acquisition generates an error.
-      return letsCrash(error);
-    });
+    // Crash the application if the acquisition generates an error.
+    }).fail(letsCrash);
   }
 
   function clearGadgetInternalParameters() {
     this.__sub_gadget_dict = {};
-    createMonitor(this);
+    createGadgetMonitor(this);
   }
 
   function loadSubGadgetDOMDeclaration() {
@@ -1110,7 +1100,7 @@ if (typeof document.contains !== 'function') {
       context = this;
 
     function prepareReportGadgetDeclarationError(scope) {
-      return function (error) {
+      return function reportGadgetDeclarationError(error) {
         var aq_dict = context.__acquired_method_dict || {},
           method_name = 'reportGadgetDeclarationError';
         if (aq_dict.hasOwnProperty(method_name)) {
@@ -1143,58 +1133,56 @@ if (typeof document.contains !== 'function') {
 
   RenderJSGadget.__ready_list = [clearGadgetInternalParameters,
                                  loadSubGadgetDOMDeclaration];
-  RenderJSGadget.ready = function (callback) {
+  RenderJSGadget.ready = function ready(callback) {
     this.__ready_list.push(callback);
     return this;
   };
-  RenderJSGadget.setState = function (state_dict) {
+  RenderJSGadget.setState = function setState(state_dict) {
     var json_state = JSON.stringify(state_dict);
-    this.__ready_list.unshift(function () {
+    this.__ready_list.unshift(function setStateDefaultValue() {
       this.state = JSON.parse(json_state);
     });
     return this;
   };
-  RenderJSGadget.onStateChange = function (callback) {
+  RenderJSGadget.onStateChange = function onStateChange(callback) {
     this.prototype.__state_change_callback = callback;
     return this;
   };
 
   RenderJSGadget.__service_list = [];
-  RenderJSGadget.declareService = function (callback) {
+  RenderJSGadget.declareService = function declareService(callback) {
     this.__service_list.push(callback);
     return this;
   };
-  RenderJSGadget.onEvent = function (type, callback, use_capture,
-                                     prevent_default) {
-    this.__service_list.push(function () {
+  RenderJSGadget.onEvent = function onEvent(type, callback, use_capture,
+                                            prevent_default) {
+    this.__service_list.push(function startLoopEventListenerService() {
       return loopEventListener(this.element, type, use_capture,
                                callback.bind(this), prevent_default);
     });
     return this;
   };
 
-  RenderJSGadget.onLoop = function (callback, delay) {
+  RenderJSGadget.onLoop = function onLoop(callback, delay) {
     if (delay === undefined) {
       delay = 0;
     }
-    this.__service_list.push(function () {
+    this.__service_list.push(function handleServiceCallback() {
       var queue_loop = new RSVP.Queue(),
         context = this,
-        wait = function () {
+        wait = function waitForLoopIteration() {
           queue_loop
-            .push(function () {
+            .push(function waitNextOnLoopDelay() {
               return RSVP.delay(delay);
             })
-            .push(function () {
+            .push(function waitNextOnLoopAnimationFrame() {
               // Only loop when the app has the focus
               return promiseAnimationFrame();
             })
-            .push(function () {
+            .push(function executeOnLoopCallback() {
               return callback.apply(context, []);
             })
-            .push(function () {
-              wait();
-            });
+            .push(wait);
         };
       wait();
       return queue_loop;
@@ -1204,7 +1192,7 @@ if (typeof document.contains !== 'function') {
 
   function runJob(gadget, name, callback, argument_list) {
     var job_promise = new RSVP.Queue()
-      .push(function () {
+      .push(function waitForJobCallback() {
         return callback.apply(gadget, argument_list);
       });
     if (gadget.__job_dict.hasOwnProperty(name)) {
@@ -1212,10 +1200,10 @@ if (typeof document.contains !== 'function') {
     }
     gadget.__job_dict[name] = job_promise;
     gadget.__monitor.monitor(new RSVP.Queue()
-      .push(function () {
+      .push(function waitForJobPromise() {
         return job_promise;
       })
-      .push(undefined, function (error) {
+      .push(undefined, function handleJobError(error) {
         if (!(error instanceof RSVP.CancellationError)) {
           throw error;
         }
@@ -1224,7 +1212,7 @@ if (typeof document.contains !== 'function') {
 
   function startService(gadget) {
     gadget.__monitor.monitor(new RSVP.Queue()
-      .push(function () {
+      .push(function monitorAllServiceList() {
         var i,
           service_list = gadget.constructor.__service_list,
           job_list = gadget.__job_list;
@@ -1245,8 +1233,8 @@ if (typeof document.contains !== 'function') {
   // gadget internal method, which trigger execution
   // of a function inside a service
   /////////////////////////////////////////////////////////////////
-  RenderJSGadget.declareJob = function (name, callback) {
-    this.prototype[name] = function () {
+  RenderJSGadget.declareJob = function declareJob(name, callback) {
+    this.prototype[name] = function triggerJob() {
       var context = this,
         argument_list = arguments;
 
@@ -1263,13 +1251,13 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // RenderJSGadget.declareMethod
   /////////////////////////////////////////////////////////////////
-  RenderJSGadget.declareMethod = function (name, callback) {
-    this.prototype[name] = function () {
+  RenderJSGadget.declareMethod = function declareMethod(name, callback) {
+    this.prototype[name] = function triggerMethod() {
       var context = this,
         argument_list = arguments;
 
       return new RSVP.Queue()
-        .push(function () {
+        .push(function waitForMethodCallback() {
           return callback.apply(context, argument_list);
         });
     };
@@ -1278,27 +1266,27 @@ if (typeof document.contains !== 'function') {
   };
 
   RenderJSGadget
-    .declareMethod('getInterfaceList', function () {
+    .declareMethod('getInterfaceList', function getInterfaceList() {
       // Returns the list of gadget prototype
       return this.__interface_list;
     })
-    .declareMethod('getRequiredCSSList', function () {
+    .declareMethod('getRequiredCSSList', function getRequiredCSSList() {
       // Returns a list of CSS required by the gadget
       return this.__required_css_list;
     })
-    .declareMethod('getRequiredJSList', function () {
+    .declareMethod('getRequiredJSList', function getRequiredJSList() {
       // Returns a list of JS required by the gadget
       return this.__required_js_list;
     })
-    .declareMethod('getPath', function () {
+    .declareMethod('getPath', function getPath() {
       // Returns the path of the code of a gadget
       return this.__path;
     })
-    .declareMethod('getTitle', function () {
+    .declareMethod('getTitle', function getTitle() {
       // Returns the title of a gadget
       return this.__title;
     })
-    .declareMethod('getElement', function () {
+    .declareMethod('getElement', function getElement() {
       // Returns the DOM Element of a gadget
       // XXX Kept for compatibility. Use element property directly
       if (this.element === undefined) {
@@ -1306,24 +1294,24 @@ if (typeof document.contains !== 'function') {
       }
       return this.element;
     })
-    .declareMethod('changeState', function (state_dict) {
+    .declareMethod('changeState', function changeState(state_dict) {
       var next_onStateChange = new RSVP.Queue(),
         previous_onStateCHange,
         context = this;
       if (context.hasOwnProperty('__previous_onStateChange')) {
         previous_onStateCHange = context.__previous_onStateChange;
         next_onStateChange
-          .push(function () {
+          .push(function waitForPreviousStateChange() {
             return previous_onStateCHange;
           })
-          .push(undefined, function () {
+          .push(undefined, function handlePreviousStateChangeError() {
             // Run callback even if previous failed
             return;
           });
       }
       context.__previous_onStateChange = next_onStateChange;
       return next_onStateChange
-        .push(function () {
+        .push(function checkStateModification() {
           var key,
             modified = false,
             previous_cancelled = context.hasOwnProperty('__modification_dict'),
@@ -1345,10 +1333,10 @@ if (typeof document.contains !== 'function') {
           if (modified && context.__state_change_callback !== undefined) {
             context.__modification_dict = modification_dict;
             return new RSVP.Queue()
-              .push(function () {
+              .push(function waitForStateChangeCallback() {
                 return context.__state_change_callback(modification_dict);
               })
-              .push(function (result) {
+              .push(function handleStateChangeSuccess(result) {
                 delete context.__modification_dict;
                 return result;
               });
@@ -1372,7 +1360,7 @@ if (typeof document.contains !== 'function') {
       }
     }
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForAcquireMethod() {
         // Do not specify default __acquired_method_dict on prototype
         // to prevent modifying this default value (with
         // allowPublicAcquiredMethod for example)
@@ -1383,7 +1371,7 @@ if (typeof document.contains !== 'function') {
         }
         throw new renderJS.AcquisitionError("aq_dynamic is not defined");
       })
-      .push(undefined, function (error) {
+      .push(undefined, function handleAcquireMethodError(error) {
         if (error instanceof renderJS.AcquisitionError) {
           return gadget.__aq_parent(method_name, argument_list);
         }
@@ -1392,12 +1380,12 @@ if (typeof document.contains !== 'function') {
   }
 
   RenderJSGadget.declareAcquiredMethod =
-    function (name, method_name_to_acquire) {
-      this.prototype[name] = function () {
+    function declareAcquiredMethod(name, method_name_to_acquire) {
+      this.prototype[name] = function acquireMethod() {
         var argument_list = Array.prototype.slice.call(arguments, 0),
           gadget = this;
         return new RSVP.Queue()
-          .push(function () {
+          .push(function waitForAqParent() {
             return gadget.__aq_parent(method_name_to_acquire, argument_list);
           });
       };
@@ -1414,7 +1402,7 @@ if (typeof document.contains !== 'function') {
   // RenderJSGadget.allowPublicAcquisition
   /////////////////////////////////////////////////////////////////
   RenderJSGadget.allowPublicAcquisition =
-    function (method_name, callback) {
+    function allowPublicAcquisition(method_name, callback) {
       this.prototype.__acquired_method_dict[method_name] = callback;
 
       // Allow chain
@@ -1423,10 +1411,11 @@ if (typeof document.contains !== 'function') {
 
   // Set aq_parent on gadget_instance which call acquire on parent_gadget
   function setAqParent(gadget_instance, parent_gadget) {
-    gadget_instance.__aq_parent = function (method_name, argument_list) {
-      return acquire.apply(parent_gadget, [gadget_instance, method_name,
-                                           argument_list]);
-    };
+    gadget_instance.__aq_parent =
+      function __aq_parent(method_name, argument_list) {
+        return acquire.apply(parent_gadget, [gadget_instance, method_name,
+                                             argument_list]);
+      };
   }
 
   /////////////////////////////////////////////////////////////////
@@ -1462,19 +1451,13 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   function privateDeclarePublicGadget(url, options, parent_gadget) {
 
-    return new RSVP.Queue()
-      .push(function () {
-        return renderJS.declareGadgetKlass(url)
-          // gadget loading should not be interrupted
-          // if not, gadget's definition will not be complete
-          //.then will return another promise
-          //so loading_klass_promise can't be cancel
-          .then(function (result) {
-            return result;
-          });
-      })
-      // Get the gadget class and instanciate it
-      .push(function (Klass) {
+    return renderJS.declareGadgetKlass(url)
+      // gadget loading should not be interrupted
+      // if not, gadget's definition will not be complete
+      //.then will return another promise
+      //so loading_klass_promise can't be cancel
+      .then(function createPrivateInstanceFromKlass(Klass) {
+        // Get the gadget class and instanciate it
         if (options.element === undefined) {
           options.element = document.createElement("div");
         }
@@ -1543,12 +1526,12 @@ if (typeof document.contains !== 'function') {
     gadget_instance = new RenderJSIframeGadget();
     setAqParent(gadget_instance, parent_gadget);
     iframe = document.createElement("iframe");
-    iframe.addEventListener('error', function (error) {
+    iframe.addEventListener('error', function handleIframeError(error) {
       iframe_loading_deferred.reject(error);
     });
-    iframe.addEventListener('load', function () {
+    iframe.addEventListener('load', function handleIframeLoad() {
       return RSVP.timeout(5000)
-        .fail(function () {
+        .fail(function triggerIframeTimeout() {
           iframe_loading_deferred.reject(
             new Error('Timeout while loading: ' + url)
           );
@@ -1573,46 +1556,51 @@ if (typeof document.contains !== 'function') {
     });
 
     // Create new method from the declareMethod call inside the iframe
-    gadget_instance.__chan.bind("declareMethod",
-                                function (trans, method_name) {
-        gadget_instance[method_name] = function () {
+    gadget_instance.__chan.bind(
+      "declareMethod",
+      function handleChannelDeclareMethod(trans, method_name) {
+        gadget_instance[method_name] = function triggerChannelDeclareMethod() {
           var argument_list = arguments,
-            wait_promise = new RSVP.Promise(function (resolve, reject) {
-              gadget_instance.__chan.call({
-                method: "methodCall",
-                params: [
-                  method_name,
-                  Array.prototype.slice.call(argument_list, 0)],
-                success: resolve,
-                error: reject
-              });
-            });
+            wait_promise = new RSVP.Promise(
+              function handleChannelCall(resolve, reject) {
+                gadget_instance.__chan.call({
+                  method: "methodCall",
+                  params: [
+                    method_name,
+                    Array.prototype.slice.call(argument_list, 0)],
+                  success: resolve,
+                  error: reject
+                });
+              }
+            );
           return new RSVP.Queue()
-            .push(function () {
+            .push(function waitForChannelCall() {
               return wait_promise;
             });
         };
         return "OK";
-      });
+      }
+    );
 
     // Wait for the iframe to be loaded before continuing
-    gadget_instance.__chan.bind("ready", function (trans) {
+    gadget_instance.__chan.bind("ready", function handleChannelReady(trans) {
       iframe_loading_deferred.resolve(gadget_instance);
       return "OK";
     });
-    gadget_instance.__chan.bind("failed", function (trans, params) {
-      iframe_loading_deferred.reject(params);
-      return "OK";
-    });
-    gadget_instance.__chan.bind("acquire", function (trans, params) {
-      gadget_instance.__aq_parent.apply(gadget_instance, params)
-        .then(function (g) {
-          trans.complete(g);
-        }).fail(function (e) {
-          trans.error(e.toString());
-        });
-      trans.delayReturn(true);
-    });
+    gadget_instance.__chan.bind("failed",
+                                function handleChannelFail(trans, params) {
+        iframe_loading_deferred.reject(params);
+        return "OK";
+      });
+    gadget_instance.__chan.bind("acquire",
+                                function handleChannelAcquire(trans, params) {
+        gadget_instance.__aq_parent.apply(gadget_instance, params)
+          .then(trans.complete)
+          .fail(function handleChannelAcquireError(e) {
+            trans.error(e.toString());
+          });
+        trans.delayReturn(true);
+      });
 
     return iframe_loading_deferred.promise;
   }
@@ -1623,10 +1611,10 @@ if (typeof document.contains !== 'function') {
   function privateDeclareDataUrlGadget(url, options, parent_gadget) {
 
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForDataUrlAjax() {
         return ajax(url);
       })
-      .push(function (xhr) {
+      .push(function handleDataURLAjaxResponse(xhr) {
         // Insert a "base" element, in order to resolve all relative links
         // which could get broken with a data url
         var doc = (new DOMParser()).parseFromString(xhr.responseText,
@@ -1639,7 +1627,7 @@ if (typeof document.contains !== 'function') {
                         {type: "text/html;charset=UTF-8"});
         return readBlobAsDataURL(blob);
       })
-      .push(function (data_url) {
+      .push(function handleDataURL(data_url) {
         return privateDeclareIframeGadget(data_url, options, parent_gadget);
       });
   }
@@ -1648,7 +1636,7 @@ if (typeof document.contains !== 'function') {
   // RenderJSGadget.declareGadget
   /////////////////////////////////////////////////////////////////
   RenderJSGadget
-    .declareMethod('declareGadget', function (url, options) {
+    .declareMethod('declareGadget', function declareGadget(url, options) {
       var parent_gadget = this;
 
       if (options === undefined) {
@@ -1662,7 +1650,7 @@ if (typeof document.contains !== 'function') {
       url = renderJS.getAbsoluteURL(url, this.__path);
 
       return new RSVP.Queue()
-        .push(function () {
+        .push(function waitForPrivateDeclareGadget() {
           var method;
           if (options.sandbox === "public") {
             method = privateDeclarePublicGadget;
@@ -1677,7 +1665,7 @@ if (typeof document.contains !== 'function') {
           return method(url, options, parent_gadget);
         })
         // Set the HTML context
-        .push(function (gadget_instance) {
+        .push(function setGadgetInstanceHTMLContext(gadget_instance) {
           var i,
             scope,
             queue = new RSVP.Queue();
@@ -1686,7 +1674,7 @@ if (typeof document.contains !== 'function') {
             return gadget_instance;
           }
           function ready_executable_wrapper(fct) {
-            return function () {
+            return function executeReadyWrapper() {
               return fct.call(gadget_instance, gadget_instance);
             };
           }
@@ -1730,13 +1718,14 @@ if (typeof document.contains !== 'function') {
           return queue;
         });
     })
-    .declareMethod('getDeclaredGadget', function (gadget_scope) {
-      if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {
-        throw new Error("Gadget scope '" + gadget_scope + "' is not known.");
-      }
-      return this.__sub_gadget_dict[gadget_scope];
-    })
-    .declareMethod('dropGadget', function (gadget_scope) {
+    .declareMethod('getDeclaredGadget',
+      function getDeclaredGadget(gadget_scope) {
+        if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {
+          throw new Error("Gadget scope '" + gadget_scope + "' is not known.");
+        }
+        return this.__sub_gadget_dict[gadget_scope];
+      })
+    .declareMethod('dropGadget', function dropGadget(gadget_scope) {
       if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {
         throw new Error("Gadget scope '" + gadget_scope + "' is not known.");
       }
@@ -1747,7 +1736,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS selector
   /////////////////////////////////////////////////////////////////
-  renderJS = function (selector) {
+  renderJS = function getLoadingGadget(selector) {
     var result;
     if (selector === window) {
       // window is the 'this' value when loading a javascript file
@@ -1763,7 +1752,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.AcquisitionError
   /////////////////////////////////////////////////////////////////
-  renderJS.AcquisitionError = function (message) {
+  renderJS.AcquisitionError = function createAcquisitionError(message) {
     this.name = "AcquisitionError";
     if ((message !== undefined) && (typeof message !== "string")) {
       throw new TypeError('You must pass a string.');
@@ -1777,7 +1766,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.getAbsoluteURL
   /////////////////////////////////////////////////////////////////
-  renderJS.getAbsoluteURL = function (url, base_url) {
+  renderJS.getAbsoluteURL = function getAbsoluteURL(url, base_url) {
     if (base_url && url) {
       return new URL(url, base_url).href;
     }
@@ -1787,7 +1776,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.declareJS
   /////////////////////////////////////////////////////////////////
-  renderJS.declareJS = function (url, container, pop) {
+  renderJS.declareJS = function declareJS(url, container, pop) {
     // https://www.html5rocks.com/en/tutorials/speed/script-loading/
     // Prevent infinite recursion if loading render.js
     // more than once
@@ -1796,28 +1785,30 @@ if (typeof document.contains !== 'function') {
       result = RSVP.resolve();
     } else {
       javascript_registration_dict[url] = null;
-      result = new RSVP.Promise(function (resolve, reject) {
-        var newScript;
-        newScript = document.createElement('script');
-        newScript.async = false;
-        newScript.type = 'text/javascript';
-        newScript.onload = function () {
-          if (pop === true) {
-            // Drop the current loading klass info used by selector
-            gadget_loading_klass_list.shift();
-          }
-          resolve();
-        };
-        newScript.onerror = function (e) {
-          if (pop === true) {
-            // Drop the current loading klass info used by selector
-            gadget_loading_klass_list.shift();
-          }
-          reject(e);
-        };
-        newScript.src = url;
-        container.appendChild(newScript);
-      });
+      result = new RSVP.Promise(
+        function waitForJSLoadEvent(resolve, reject) {
+          var newScript;
+          newScript = document.createElement('script');
+          newScript.async = false;
+          newScript.type = 'text/javascript';
+          newScript.onload = function triggerJSLoaded() {
+            if (pop === true) {
+              // Drop the current loading klass info used by selector
+              gadget_loading_klass_list.shift();
+            }
+            resolve();
+          };
+          newScript.onerror = function triggerJSNotLoaded(e) {
+            if (pop === true) {
+              // Drop the current loading klass info used by selector
+              gadget_loading_klass_list.shift();
+            }
+            reject(e);
+          };
+          newScript.src = url;
+          container.appendChild(newScript);
+        }
+      );
     }
     return result;
   };
@@ -1825,7 +1816,7 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.declareCSS
   /////////////////////////////////////////////////////////////////
-  renderJS.declareCSS = function (url, container) {
+  renderJS.declareCSS = function declareCSS(url, container) {
     // https://github.com/furf/jquery-getCSS/blob/master/jquery.getCSS.js
     // No way to cleanly check if a css has been loaded
     // So, always resolve the promise...
@@ -1834,19 +1825,17 @@ if (typeof document.contains !== 'function') {
     if (stylesheet_registration_dict.hasOwnProperty(url)) {
       result = RSVP.resolve();
     } else {
-      result = new RSVP.Promise(function (resolve, reject) {
+      result = new RSVP.Promise(function waitForCSSLoadEvent(resolve, reject) {
         var link;
         link = document.createElement('link');
         link.rel = 'stylesheet';
         link.type = 'text/css';
         link.href = url;
-        link.onload = function () {
+        link.onload = function triggerCSSLoaded() {
           stylesheet_registration_dict[url] = null;
           resolve();
         };
-        link.onerror = function (e) {
-          reject(e);
-        };
+        link.onerror = reject;
         container.appendChild(link);
       });
     }
@@ -1862,7 +1851,7 @@ if (typeof document.contains !== 'function') {
       key,
       parsed_html;
     // Class inheritance
-    tmp_constructor = function () {
+    tmp_constructor = function createSuperKlass() {
       RenderJSGadget.call(this);
     };
     tmp_constructor.__ready_list = RenderJSGadget.__ready_list.slice();
@@ -1908,23 +1897,35 @@ if (typeof document.contains !== 'function') {
     return tmp_constructor;
   }
 
-  renderJS.declareGadgetKlass = function (url) {
+  renderJS.declareGadgetKlass = function declareGadgetKlass(url) {
+    var tmp_constructor,
+      defer;
+
     if (gadget_model_defer_dict.hasOwnProperty(url)) {
       // Return klass object if it already exists
-      return gadget_model_defer_dict[url].promise;
+      if (gadget_model_defer_dict[url].hasOwnProperty('defer_list')) {
+        // Klass not yet loaded.
+        // Add a new defer
+        defer = RSVP.defer();
+        gadget_model_defer_dict[url].defer_list.push(defer);
+        return defer.promise;
+      }
+      if (gadget_model_defer_dict[url].is_resolved) {
+        return RSVP.resolve(gadget_model_defer_dict[url].result);
+      }
+      return RSVP.reject(gadget_model_defer_dict[url].result);
     }
 
-    var tmp_constructor,
-      defer = RSVP.defer();
-
-    gadget_model_defer_dict[url] = defer;
+    gadget_model_defer_dict[url] = {
+      defer_list: []
+    };
 
     // Fetch the HTML page and parse it
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForGadgetKlassAjax() {
         return ajax(url);
       })
-      .push(function (result) {
+      .push(function handleGadgetKlassAjax(result) {
         tmp_constructor = parse(result, url);
         var fragment = document.createDocumentFragment(),
           promise_list = [],
@@ -1946,14 +1947,28 @@ if (typeof document.contains !== 'function') {
         document.head.appendChild(fragment);
         return RSVP.all(promise_list);
       })
-      .push(function () {
-        defer.resolve(tmp_constructor);
+      .push(function handleGadgetKlassLoadingSuccess() {
+        var i,
+          len = gadget_model_defer_dict[url].defer_list.length;
+        for (i = 0; i < len; i += 1) {
+          gadget_model_defer_dict[url].defer_list[i].resolve(tmp_constructor);
+        }
+        delete gadget_model_defer_dict[url].defer_list;
+        gadget_model_defer_dict[url].result = tmp_constructor;
+        gadget_model_defer_dict[url].is_resolved = true;
         return tmp_constructor;
       })
-      .push(undefined, function (e) {
+      .push(undefined, function handleGadgetKlassLoadingError(e) {
         // Drop the current loading klass info used by selector
         // even in case of error
-        defer.reject(e);
+        var i,
+          len = gadget_model_defer_dict[url].defer_list.length;
+        for (i = 0; i < len; i += 1) {
+          gadget_model_defer_dict[url].defer_list[i].reject(e);
+        }
+        delete gadget_model_defer_dict[url].defer_list;
+        gadget_model_defer_dict[url].result = e;
+        gadget_model_defer_dict[url].is_resolved = false;
         throw e;
       });
   };
@@ -1962,7 +1977,7 @@ if (typeof document.contains !== 'function') {
   // renderJS.clearGadgetKlassList
   /////////////////////////////////////////////////////////////////
   // For test purpose only
-  renderJS.clearGadgetKlassList = function () {
+  renderJS.clearGadgetKlassList = function clearGadgetKlassList() {
     gadget_model_defer_dict = {};
     javascript_registration_dict = {};
     stylesheet_registration_dict = {};
@@ -1971,53 +1986,54 @@ if (typeof document.contains !== 'function') {
   /////////////////////////////////////////////////////////////////
   // renderJS.parseGadgetHTMLDocument
   /////////////////////////////////////////////////////////////////
-  renderJS.parseGadgetHTMLDocument = function (document_element, url) {
-    var settings = {
-        title: "",
-        interface_list: [],
-        required_css_list: [],
-        required_js_list: []
-      },
-      i,
-      element;
-
-    if (!url || !isAbsoluteOrDataURL.test(url)) {
-      throw new Error("The url should be absolute: " + url);
-    }
+  renderJS.parseGadgetHTMLDocument =
+    function parseGadgetHTMLDocument(document_element, url) {
+      var settings = {
+          title: "",
+          interface_list: [],
+          required_css_list: [],
+          required_js_list: []
+        },
+        i,
+        element;
+
+      if (!url || !isAbsoluteOrDataURL.test(url)) {
+        throw new Error("The url should be absolute: " + url);
+      }
 
-    if (document_element.nodeType === 9) {
-      settings.title = document_element.title;
-
-      if (document_element.head !== null) {
-        for (i = 0; i < document_element.head.children.length; i += 1) {
-          element = document_element.head.children[i];
-          if (element.href !== null) {
-            // XXX Manage relative URL during extraction of URLs
-            // element.href returns absolute URL in firefox but "" in chrome;
-            if (element.rel === "stylesheet") {
-              settings.required_css_list.push(
-                renderJS.getAbsoluteURL(element.getAttribute("href"), url)
-              );
-            } else if (element.nodeName === "SCRIPT" &&
-                       (element.type === "text/javascript" ||
-                        !element.type)) {
-              settings.required_js_list.push(
-                renderJS.getAbsoluteURL(element.getAttribute("src"), url)
-              );
-            } else if (element.rel ===
-                       "http://www.renderjs.org/rel/interface") {
-              settings.interface_list.push(
-                renderJS.getAbsoluteURL(element.getAttribute("href"), url)
-              );
+      if (document_element.nodeType === 9) {
+        settings.title = document_element.title;
+
+        if (document_element.head !== null) {
+          for (i = 0; i < document_element.head.children.length; i += 1) {
+            element = document_element.head.children[i];
+            if (element.href !== null) {
+              // XXX Manage relative URL during extraction of URLs
+              // element.href returns absolute URL in firefox but "" in chrome;
+              if (element.rel === "stylesheet") {
+                settings.required_css_list.push(
+                  renderJS.getAbsoluteURL(element.getAttribute("href"), url)
+                );
+              } else if (element.nodeName === "SCRIPT" &&
+                         (element.type === "text/javascript" ||
+                          !element.type)) {
+                settings.required_js_list.push(
+                  renderJS.getAbsoluteURL(element.getAttribute("src"), url)
+                );
+              } else if (element.rel ===
+                         "http://www.renderjs.org/rel/interface") {
+                settings.interface_list.push(
+                  renderJS.getAbsoluteURL(element.getAttribute("href"), url)
+                );
+              }
             }
           }
         }
+      } else {
+        throw new Error("The first parameter should be an HTMLDocument");
       }
-    } else {
-      throw new Error("The first parameter should be an HTMLDocument");
-    }
-    return settings;
-  };
+      return settings;
+    };
 
   /////////////////////////////////////////////////////////////////
   // global
@@ -2037,7 +2053,7 @@ if (typeof document.contains !== 'function') {
   // is triggered before everything was ready.
   // (For instance, the HTML-tag for the self gadget gets inserted after
   //  page load)
-  renderJS.manualBootstrap = function () {
+  renderJS.manualBootstrap = function manualBootstrap() {
     all_dependency_loaded_deferred.resolve();
   };
   document.addEventListener('DOMContentLoaded',
@@ -2065,7 +2081,7 @@ if (typeof document.contains !== 'function') {
     TmpConstructor.__template_element.appendChild(fragment);
     return RSVP.all([root_gadget.getRequiredJSList(),
               root_gadget.getRequiredCSSList()])
-      .then(function (all_list) {
+      .then(function handleRequireDependencyList(all_list) {
         var i,
           js_list = all_list[0],
           css_list = all_list[1];
@@ -2076,14 +2092,14 @@ if (typeof document.contains !== 'function') {
           stylesheet_registration_dict[css_list[i]] = null;
         }
         gadget_loading_klass_list.shift();
-      }).then(function () {
+      }).then(function createMutationObserver() {
 
         // select the target node
         var target = document.querySelector('body'),
           // create an observer instance
-          observer = new MutationObserver(function (mutations) {
+          observer = new MutationObserver(function observeMutatios(mutations) {
             var i, k, len, len2, node, added_list;
-            mutations.forEach(function (mutation) {
+            mutations.forEach(function observerMutation(mutation) {
               if (mutation.type === 'childList') {
 
                 len = mutation.removedNodes.length;
@@ -2092,7 +2108,7 @@ if (typeof document.contains !== 'function') {
                   if (node.nodeType === Node.ELEMENT_NODE) {
                     if (node.hasAttribute("data-gadget-url") &&
                         (node._gadget !== undefined)) {
-                      createMonitor(node._gadget);
+                      createGadgetMonitor(node._gadget);
                     }
                     added_list =
                       node.querySelectorAll("[data-gadget-url]");
@@ -2100,7 +2116,7 @@ if (typeof document.contains !== 'function') {
                     for (k = 0; k < len2; k += 1) {
                       node = added_list[k];
                       if (node._gadget !== undefined) {
-                        createMonitor(node._gadget);
+                        createGadgetMonitor(node._gadget);
                       }
                     }
                   }
@@ -2151,13 +2167,13 @@ if (typeof document.contains !== 'function') {
   function createLastAcquisitionGadget() {
     var last_acquisition_gadget = new RenderJSGadget();
     last_acquisition_gadget.__acquired_method_dict = {
-      reportServiceError: function (param_list) {
+      reportServiceError: function reportServiceError(param_list) {
         letsCrash(param_list[0]);
       }
     };
     // Stop acquisition on the last acquisition gadget
     // Do not put this on the klass, as their could be multiple instances
-    last_acquisition_gadget.__aq_parent = function (method_name) {
+    last_acquisition_gadget.__aq_parent = function __aq_parent(method_name) {
       throw new renderJS.AcquisitionError(
         "No gadget provides " + method_name
       );
@@ -2205,7 +2221,7 @@ if (typeof document.contains !== 'function') {
     ];
 
     // Inform parent gadget about declareMethod calls here.
-    notifyDeclareMethod = function (name) {
+    notifyDeclareMethod = function notifyDeclareMethod(name) {
       declare_method_list_waiting.push(name);
     };
 
@@ -2218,13 +2234,13 @@ if (typeof document.contains !== 'function') {
       loading_result = RSVP.any([
         channel_defer.promise,
         new RSVP.Queue()
-          .push(function () {
+          .push(function waitForParentChannelCreation() {
             // Expect the channel to parent to be usable after 1 second
             // If not, consider the gadget as the root
             // Drop all iframe channel communication
             return RSVP.delay(1000);
           })
-          .push(function () {
+          .push(function handleParentChannelCreation() {
             real_result_list[2] = undefined;
             return real_result_list;
           })
@@ -2234,20 +2250,22 @@ if (typeof document.contains !== 'function') {
         window: window.parent,
         origin: "*",
         scope: "renderJS",
-        onReady: function () {
+        onReady: function onChannelReady() {
           var k,
             len;
           // Channel is ready, so now declare all methods
-          notifyDeclareMethod = function (name) {
+          notifyDeclareMethod = function notifyDeclareMethod(name) {
             declare_method_list_waiting.push(
-              new RSVP.Promise(function (resolve, reject) {
-                embedded_channel.call({
-                  method: "declareMethod",
-                  params: name,
-                  success: resolve,
-                  error: reject
-                });
-              })
+              new RSVP.Promise(
+                function promiseChannelDeclareMethodCall(resolve, reject) {
+                  embedded_channel.call({
+                    method: "declareMethod",
+                    params: name,
+                    success: resolve,
+                    error: reject
+                  });
+                }
+              )
             );
           };
 
@@ -2263,7 +2281,7 @@ if (typeof document.contains !== 'function') {
     }
 
     // Surcharge declareMethod to inform parent window
-    TmpConstructor.declareMethod = function (name, callback) {
+    TmpConstructor.declareMethod = function declareMethod(name, callback) {
       var result = RenderJSGadget.declareMethod.apply(
           this,
           [name, callback]
@@ -2300,11 +2318,11 @@ if (typeof document.contains !== 'function') {
       return root_gadget;
     }
     function ready_executable_wrapper(fct) {
-      return function (g) {
+      return function wrapReadyFunction(g) {
         return fct.call(g, g);
       };
     }
-    TmpConstructor.ready(function () {
+    TmpConstructor.ready(function startServiceInReady() {
       return startService(this);
     });
 
@@ -2323,35 +2341,32 @@ if (typeof document.contains !== 'function') {
                                        embedded_channel) {
     // Define __aq_parent to inform parent window
     root_gadget.__aq_parent =
-      TmpConstructor.prototype.__aq_parent = function (method_name,
-                                                       argument_list,
-                                                       time_out) {
-        return new RSVP.Promise(function (resolve, reject) {
-          embedded_channel.call({
-            method: "acquire",
-            params: [
-              method_name,
-              argument_list
-            ],
-            success: function (s) {
-              resolve(s);
-            },
-            error: function (e) {
-              reject(e);
-            },
-            timeout: time_out
-          });
-        });
+      TmpConstructor.prototype.__aq_parent = function aq_parent(method_name,
+                                                                argument_list,
+                                                                time_out) {
+        return new RSVP.Promise(
+          function waitForChannelAcquire(resolve, reject) {
+            embedded_channel.call({
+              method: "acquire",
+              params: [
+                method_name,
+                argument_list
+              ],
+              success: resolve,
+              error: reject,
+              timeout: time_out
+            });
+          }
+        );
       };
 
     // bind calls to renderJS method on the instance
-    embedded_channel.bind("methodCall", function (trans, v) {
+    embedded_channel.bind("methodCall", function methodCall(trans, v) {
       root_gadget[v[0]].apply(root_gadget, v[1])
-        .push(function (g) {
-          trans.complete(g);
-        }, function (e) {
-          trans.error(e.toString());
-        });
+        .push(trans.complete,
+          function handleMethodCallError(e) {
+            trans.error(e.toString());
+          });
       trans.delayReturn(true);
     });
   }
@@ -2365,11 +2380,11 @@ if (typeof document.contains !== 'function') {
       declare_method_list_waiting;
 
     return new RSVP.Queue()
-      .push(function () {
+      .push(function waitForLoadingGadget() {
         // Wait for the loading gadget to be created
         return wait_for_gadget_loaded;
       })
-      .push(function (result_list) {
+      .push(function handleLoadingGadget(result_list) {
         TmpConstructor = result_list[0];
         root_gadget = result_list[1];
         embedded_channel = result_list[2];
@@ -2377,11 +2392,11 @@ if (typeof document.contains !== 'function') {
         // Wait for all the gadget dependencies to be loaded
         return all_dependency_loaded_deferred.promise;
       })
-      .push(function () {
+      .push(function waitForDeclareMethodList() {
         // Wait for all methods to be correctly declared
         return RSVP.all(declare_method_list_waiting);
       })
-      .push(function (result_list) {
+      .push(function waitForMutationObserver(result_list) {
         if (embedded_channel !== undefined) {
           finishAqParentConfiguration(TmpConstructor, root_gadget,
                                       embedded_channel);
@@ -2389,16 +2404,16 @@ if (typeof document.contains !== 'function') {
         // Check all DOM modifications to correctly start/stop services
         return configureMutationObserver(TmpConstructor, url, root_gadget);
       })
-      .push(function () {
+      .push(function waitForReadyList() {
         // Trigger all ready functions
         return triggerReadyList(TmpConstructor, root_gadget);
       })
-      .push(function () {
+      .push(function notifyReady() {
         if (embedded_channel !== undefined) {
           embedded_channel.notify({method: "ready"});
         }
       })
-      .push(undefined, function (e) {
+      .push(undefined, function handleBootstrapError(e) {
         letsCrash(e);
         if (embedded_channel !== undefined) {
           embedded_channel.notify({method: "failed", params: e.toString()});
@@ -2412,4 +2427,4 @@ if (typeof document.contains !== 'function') {
   );
 
 }(document, window, RSVP, DOMParser, Channel, MutationObserver, Node,
-  FileReader, Blob, navigator, Event, URL));
+  FileReader, Blob, navigator, Event, URL));
\ No newline at end of file