diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_router_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_router_js.js
index b52cb5d3970b2c0cb5e4d1e5bf8dfedc9f7ff377..e72219594a6a1bd1c1b95856d9faaf247d99039d 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_router_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_router_js.js
@@ -102,8 +102,12 @@
   //////////////////////////////////////////////////////////////////
   // Change URL functions
   //////////////////////////////////////////////////////////////////
-  function synchronousChangeState(hash) {
-    window.location.replace(hash);
+  function synchronousChangeState(hash, push_history) {
+    if (push_history) {
+      window.location = hash;
+    } else {
+      window.location.replace(hash);
+    }
     // Prevent execution of all next asynchronous code
     throw new RSVP.CancellationError('Redirecting to ' + hash);
   }
@@ -970,14 +974,14 @@
       return hash;
     })
 
-    .declareMethod('redirect', function (options) {
+    .declareMethod('redirect', function (options, push_history) {
       this.props.form_content = options.form_content;
       // XXX Should we make it a second method parameter
       this.props.keep_message = true;
       delete options.form_content;
       return this.getCommandUrlFor(options)
         .push(function (hash) {
-          return synchronousChangeState(hash);
+          return synchronousChangeState(hash, push_history);
         });
     })