diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_relationstringfield_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_relationstringfield_js.xml
index bb9429b59d547699c4536be95555953ae028f0b7..24c247734708d2cfca85e17ffcd2791218d848cc 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_relationstringfield_js.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_relationstringfield_js.xml
@@ -213,6 +213,7 @@ promiseEventListener */\n
       len = my_result_list.length,\n
       prefix = "",\n
       item,\n
+      value_dict,\n
       result,\n
       i;\n
 \n
@@ -227,7 +228,8 @@ promiseEventListener */\n
     list.appendChild(head);\n
 \n
     for (i = 0; i < len; i += 1) {\n
-      result = my_result_list[i].value;\n
+      result = my_result_list[i];\n
+      value_dict = result.value;\n
       item = document.createElement("li");\n
       item.className = str;\n
 \n
@@ -235,8 +237,9 @@ promiseEventListener */\n
       // NOTE: if doing more complex UI, beware the textContent value won\'t\n
       // work, because currently it\'s used to retrieve the link from\n
       // the last autocomplete query results!\n
-      item.textContent = result[index];\n
-      item.setAttribute("name", result.uid);\n
+      item.textContent = value_dict[index];\n
+      item.setAttribute("data-relative-url", result.id);\n
+      item.setAttribute("name", value_dict.uid);\n
       list.appendChild(item);\n
     }\n
 \n
@@ -258,9 +261,33 @@ promiseEventListener */\n
       my_gadget.notifyChange()\n
     ]);\n
   }\n
+\n
+  // set the link to jump to\n
+  function setRelationJump(my_gadget, my_initial_call, my_selected_value) {\n
+    var props = my_gadget.property_dict,\n
+      field_json = props.field_json,\n
+      target_url = my_selected_value || field_json.relation_item_relative_url,\n
+      is_init = my_initial_call === true;\n
+\n
+    if (target_url && field_json.allow_jump) {\n
+      return new RSVP.Queue()\n
+        .push(function () {\n
+          return my_gadget.whoWantToDisplayThis(target_url);\n
+        })\n
+        .push(function (my_url) {\n
+          var plane = props.plane;\n
+          plane.href = my_url;\n
+          plane.className = "ui-btn ui-corner-all ui-btn-icon-notext " +\n
+            "ui-icon-plane ui-shadow-inset ui-btn-inline";\n
+          if (is_init === false) {\n
+            return notifyChange(my_gadget);\n
+          }\n
+        });\n
+    }\n
+  }\n
 \n
   // trigger autocomplete for field value, on render() with value only sets link\n
-  function triggerAutocomplete(my_gadget, my_value, my_initial_call) {\n
+  function triggerAutocomplete(my_gadget, my_value) {\n
     var props = my_gadget.property_dict,\n
       field_json = props.field_json,\n
       index = field_json.catalog_index,\n
@@ -268,7 +295,8 @@ promiseEventListener */\n
       lines = field_json.lines || 11,\n
       select_list = [index, "uid"],\n
       query_string = " AND (" + index + \':"\' + my_value + \'")\',\n
-      result_dict;\n
+      result_dict,\n
+      no_results;\n
 \n
     delete props.selected_uid;\n
 \n
@@ -289,14 +317,10 @@ promiseEventListener */\n
       }).push(function (my_result) {\n
         result_dict = my_result.data;\n
         props.spinner.className = "ui-hidden-accessible";\n
+        no_results = result_dict.total_rows === 0;\n
 \n
-        // skip showing single result on render(), only set link\n
-        // if (my_initial_call) {\n
-        //   return {"target": {"textContent": my_value}};\n
-        // }\n
-\n
-        // show "new" tag if no results and creation allowed\n
-        if (result_dict.total_rows === 0 && field_json.allow_creation) {\n
+        // show "new" tag\n
+        if (no_results && field_json.allow_creation) {\n
           return new RSVP.Queue()\n
             .push(function () {\n
               props.wrapper.appendChild(createNewTag(my_gadget));\n
@@ -313,23 +337,26 @@ promiseEventListener */\n
               var original_value = field_json.value || field_json.default || "";\n
               clearResults(my_gadget);\n
               props.wrapper.querySelector("input").value = original_value;\n
-              return triggerAutocomplete(my_gadget, original_value, true);\n
+              return triggerAutocomplete(my_gadget, original_value);\n
             });\n
         }\n
 \n
         // default autocomplete\n
-        // XXX: on small displays JQM will toggle headers, find way to prevent!\n
         return new RSVP.Queue()\n
           .push(function () {\n
             var list;\n
-            props.wrapper.appendChild(createResults(result_dict.rows, index));\n
-            list = props.wrapper.querySelector("ul");\n
 \n
-            return RSVP.any([\n
-              promiseEventListener(list, "click", true),\n
-              promiseEventListener(list, "touchend", true)\n
-            ]);\n
+            if (no_results === false) {\n
+              props.wrapper.appendChild(createResults(result_dict.rows, index));\n
+              list = props.wrapper.querySelector("ul");\n
+\n
+              return RSVP.any([\n
+                promiseEventListener(list, "click", true),\n
+                promiseEventListener(list, "touchend", true)\n
+              ]);\n
+            }\n
           });\n
+\n
       }).push(undefined, function (my_error) {\n
         if (my_error instanceof RSVP.CancellationError) {\n
           props.spinner.className = "ui-hidden-accessible";\n
@@ -337,41 +364,20 @@ promiseEventListener */\n
         }\n
         throw my_error;\n
       }).push(function (my_selection_event) {\n
-        var selected_value,\n
-          record,\n
-          i,\n
-          prop;\n
+        var element,\n
+          jump_url;\n
 \n
         if (my_selection_event) {\n
 \n
           // take entered text, set to input and clear list options\n
-          selected_value = my_selection_event.target.textContent;\n
-          props.selected_uid = my_selection_event.target.getAttribute("name");\n
+          element = my_selection_event.target;\n
+          jump_url = element.getAttribute("data-relative-url");\n
+          props.selected_uid = element.getAttribute("name");\n
           props.valid = true;\n
-          props.wrapper.querySelector("input").value = selected_value;\n
+          props.wrapper.querySelector("input").value = element.textContent;\n
           clearResults(my_gadget, "skip");\n
 \n
-          // retrieve url if "allow_jump" is set\n
-          if (props.field_json.allow_jump) {\n
-            for (i = 0; i < result_dict.total_rows; i += 1) {\n
-              record = result_dict.rows[i].value;\n
-              for (prop in record) {\n
-                if (record.hasOwnProperty(prop) &&\n
-                    record[prop] === selected_value) {\n
-                  return my_gadget.whoWantToDisplayThis(result_dict.rows[i].id);\n
-                }\n
-              }\n
-            }\n
-          }\n
-        }\n
-      }).push(function (my_url) {\n
-        if (my_url) {\n
-          props.plane.href = my_url;\n
-          props.plane.className = "ui-btn ui-corner-all ui-btn-icon-notext " +\n
-            "ui-icon-plane ui-shadow-inset ui-btn-inline";\n
-          if (my_initial_call === undefined) {\n
-            return notifyChange(my_gadget);\n
-          }\n
+          return setRelationJump(my_gadget, undefined, jump_url);\n
         }\n
       });\n
   }\n
@@ -435,10 +441,9 @@ promiseEventListener */\n
         // input.setAttribute(\'disabled\', \'disabled\');\n
       }\n
 \n
-      /* // set relation field links (without showing 1 autocomplete result)\n
       if (value) {\n
-        return triggerAutocomplete(field_gadget, value, true);\n
-      } */\n
+        return setRelationJump(field_gadget, true);\n
+      }\n
     })\n
 \n
     // get content (needs hidden fields, too, when creating new records)\n
@@ -590,6 +595,8 @@ promiseEventListener */\n
   - OK fix double list because not clearing what previous chain appended to DOM\n
   - OK cleanup\n
   - OK fix textinput css, not generic enough\n
+  - OK reimplement setting link without calling allDocs\n
+  - on small displays JQM will toggle headers, find way to prevent!\n
   - fix broken promise chain\n
   - test\n
   - keyboard speed test\n
@@ -597,6 +604,9 @@ promiseEventListener */\n
   - do multiRelationfield\n
   - find way to digest response of erp5? submit should clean input\n
   - add column_list parameter to pass more than title = "John Smith", render?\n
+ \n
+ \n
+  \n
 */\n
 
 
@@ -735,7 +745,7 @@ promiseEventListener */\n
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>941.663.47886.51865</string> </value>
+                <value> <string>941.954.47433.61593</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -753,7 +763,7 @@ promiseEventListener */\n
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1424080843.6</float>
+                        <float>1424099091.91</float>
                         <string>GMT</string>
                       </tuple>
                     </state>