diff --git a/master/bt5/slapos_jio/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml b/master/bt5/slapos_jio/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml
index b071ecabdcbf933221cf39304df18419396ea148..e57d7a2d08ad04f134ac9bb0cbdbab04a807c02d 100644
--- a/master/bt5/slapos_jio/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml
+++ b/master/bt5/slapos_jio/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.xml
@@ -64,16 +64,24 @@ if response is None:\n
   response = REQUEST.RESPONSE\n
 \n
 url_template_dict = {\n
-  "form_action": "%(context_url)s/%(action_id)s",\n
-  "document_hal": "%(context_url)s/%(script_id)s",\n
-  "form_definition_hal": "%(root_url)s/%(script_id)s?mode=form_definition" + \\\n
-                         "&skin_id=%(skin_id)s",\n
+  "form_action": "%(traversed_document_url)s/%(action_id)s",\n
+  "traverse_template": "%(root_url)s/%(script_id)s?mode=traverse" + \\\n
+                       "{&relative_url,view}",\n
+  "document_hal": "%(root_url)s/%(script_id)s?mode=traverse" + \\\n
+                  "&relative_url=%(relative_url)s",\n
   "search_template": "%(root_url)s/%(script_id)s?mode=search" + \\\n
                      "{&query,select_list*,limit*}",\n
-  "traverse_template": "%(root_url)s/{+relative_url}/%(script_id)s{?view}",\n
   "new_content_action": "%(root_url)s/%(script_id)s?mode=newContent",\n
 }\n
 \n
+def getFormRelativeUrl(form):\n
+  return portal.portal_catalog(\n
+    portal_type="Form",\n
+    uid=form.getUid(),\n
+    limit=1,\n
+    select_dict={\'relative_url\': None}\n
+  )[0].relative_url\n
+\n
 def renderField(field, meta_type=None):\n
   if meta_type is None:\n
     meta_type = field.meta_type\n
@@ -113,7 +121,7 @@ def renderField(field, meta_type=None):\n
     # XXX Not implemented\n
     columns = field.get_value("columns")\n
 \n
-    list_method = getattr(context, context.Listbox_getListMethodName(field))\n
+    list_method = getattr(traversed_document, traversed_document.Listbox_getListMethodName(field))\n
     portal_types = [x[1] for x in field.get_value(\'portal_types\')]\n
     default_params = dict(field.get_value(\'default_params\'))\n
     default_params.update(REQUEST.form)\n
@@ -125,7 +133,8 @@ def renderField(field, meta_type=None):\n
       document = row.getObject()\n
       line = {\n
         "url": url_template_dict["document_hal"] % {\n
-          "context_url": document.absolute_url(),\n
+          "root_url": site_root.absolute_url(),\n
+          "relative_url": document.getRelativeUrl(),\n
           "script_id": script.id\n
         }\n
       }\n
@@ -155,52 +164,64 @@ def renderField(field, meta_type=None):\n
 \n
 \n
 def renderForm(form, response_dict):\n
-  REQUEST.set(\'here\', context)\n
+  REQUEST.set(\'here\', traversed_document)\n
 \n
   # Form action\n
   response_dict[\'_actions\'] = {\n
     \'put\': {\n
       "href": url_template_dict["form_action"] % {\n
-        "context_url": context.absolute_url(),\n
+        "traversed_document_url": traversed_document.absolute_url(),\n
         "action_id": form.action\n
       },\n
       "method": form.method,\n
     }\n
   }\n
-  # Form context\n
-  response_dict[\'_links\'][\'context\'] = {\n
+  # Form traversed_document\n
+  response_dict[\'_links\'][\'traversed_document\'] = {\n
     "href": url_template_dict["document_hal"] % {\n
-      "context_url": context.absolute_url(),\n
+      "root_url": site_root.absolute_url(),\n
+      "relative_url": traversed_document.getRelativeUrl(),\n
       "script_id": script.id\n
     },\n
-    "name": context.getRelativeUrl(),\n
-    "title": context.getTitle()\n
+    "name": traversed_document.getRelativeUrl(),\n
+    "title": traversed_document.getTitle()\n
   }\n
 \n
-  form_definition = {\n
-    "_links": {\n
-      "self": {\n
-        "href": url_template_dict["form_definition_hal"] % {\n
-          "root_url": site_root.absolute_url(),\n
-          "script_id": script.id,\n
-          "skin_id": form.id\n
-        },\n
-        \'name\': form.id\n
-      }\n
-    }\n
-  }\n
-  renderFormDefinition(form, form_definition)\n
-  response_dict[\'_embedded\'] = {\n
-    \'form_definition\': form_definition\n
-  }\n
-  response_dict[\'_links\'][\'form_definition\'] = {\n
-    "href": url_template_dict["form_definition_hal"] % {\n
-      "root_url": site_root.absolute_url(),\n
-      "script_id": script.id,\n
-      "skin_id": form.id,\n
-    },\n
-    \'name\': form.id\n
-  }\n
+#   form_definition = {\n
+#     "_links": {\n
+#       "self": {\n
+#         "href": url_template_dict["document_hal"] % {\n
+#           "root_url": site_root.absolute_url(),\n
+#           "script_id": script.id,\n
+#           "relative_url": getFormRelativeUrl(form)\n
+#         },\n
+#         \'name\': form.id\n
+#       }\n
+#     }\n
+#   }\n
+#   traversed_document.log("cosucous" * 20)\n
+#   for key in REQUEST.keys():\n
+#     traversed_document.log("-" * 20)\n
+#     traversed_document.log(key)\n
+#     traversed_document.log(REQUEST[key])\n
+\n
+#   traversed_document.log(portal.portal_catalog(portal_type="Form", uid=form.getUid(),\n
+#                                     limit=1, select_dict={\'relative_url\': None})[0].relative_url)\n
+#   renderFormDefinition(form, form_definition)\n
+#   response_dict[\'_embedded\'] = {\n
+#     \'form_definition\': form_definition\n
+#   }\n
+\n
+\n
+  # XXX Need ERP5Form patch\n
+#   response_dict[\'_links\'][\'form_definition\'] = {\n
+#     "href": url_template_dict["document_hal"] % {\n
+#       "root_url": site_root.absolute_url(),\n
+#       "script_id": script.id,\n
+#       "relative_url": getFormRelativeUrl(form)\n
+#     },\n
+#     \'name\': form.id\n
+#   }\n
 \n
   group_list = []\n
   for group in form.Form_getGroupTitleAndId():\n
@@ -213,12 +234,12 @@ def renderForm(form, response_dict):\n
           response_dict[field.id] = renderField(field)\n
 \n
   #       for field_group in field.form.get_groups():\n
-  #         context.log("Field group: " + field_group)\n
-  #         context.log(field_group)\n
+  #         traversed_document.log("Field group: " + field_group)\n
+  #         traversed_document.log(field_group)\n
   #         for field_property in field.form.get_fields_in_group(field_group):\n
-  # #           context.log("Field attribute: " + field_property.id)\n
+  # #           traversed_document.log("Field attribute: " + field_property.id)\n
   # #           field.get_value(field_property.id)\n
-  #           context.log(field_property)\n
+  #           traversed_document.log(field_property)\n
 \n
 #       group_list.append((group[\'gid\'], field_list))\n
 \n
@@ -298,30 +319,36 @@ context.Base_prepareCorsResponse(RESPONSE=response)\n
 \n
 mime_type = \'application/hal+json\'\n
 portal = context.getPortalObject()\n
-sql_catalog = context.portal_catalog.getSQLCatalog()\n
+sql_catalog = portal.portal_catalog.getSQLCatalog()\n
 \n
 # Calculate the site root to prevent unexpected browsing\n
 is_web_mode = (context.REQUEST.get(\'current_web_section\', None) is not None) or context.isWebMode()\n
-# is_web_mode =  context.isWebMode()\n
+# is_web_mode =  traversed_document.isWebMode()\n
 if is_web_mode:\n
   site_root = context.getWebSiteValue()\n
 else:\n
   site_root = portal\n
 \n
-# Check if context is the site_root\n
-is_site_root = (context.getPath() == site_root.getPath())\n
-is_portal = (context.getPath() == portal.getPath())\n
+# Check if traversed_document is the site_root\n
+if relative_url:\n
+  traversed_document = site_root.restrictedTraverse(relative_url)\n
+else:\n
+  traversed_document = context\n
+is_site_root = (traversed_document.getPath() == site_root.getPath())\n
+is_portal = (traversed_document.getPath() == portal.getPath())\n
 \n
 result_dict = {\n
   \'_debug\': mode,\n
   \'_links\': {\n
     "self": {\n
-      "href": context.Base_getRequestUrl()\n
+      # XXX Include query parameters\n
+      "href": traversed_document.Base_getRequestUrl()\n
     },\n
     # Always inform about site root\n
     "site_root": {\n
       "href": url_template_dict["document_hal"] % {\n
-        "context_url": site_root.absolute_url(),\n
+        "root_url": site_root.absolute_url(),\n
+        "relative_url": "",\n
         "script_id": script.id\n
       },\n
       "name": site_root.getTitle(),\n
@@ -330,12 +357,12 @@ result_dict = {\n
 }\n
 \n
 \n
-if mime_type != context.Base_handleAcceptHeader([mime_type]):\n
+if mime_type != traversed_document.Base_handleAcceptHeader([mime_type]):\n
   response.setStatus(406)\n
   return ""\n
 \n
 \n
-elif mode == \'document\':\n
+elif (mode == \'root\') or (mode == \'traverse\'):\n
   #################################################\n
   # Raw document\n
   #################################################\n
@@ -344,21 +371,23 @@ elif mode == \'document\':\n
     return ""\n
   # Default properties shared by all ERP5 Document and Site\n
   action_dict = {}\n
-  result_dict[\'_relative_url\'] = context.getRelativeUrl()\n
+  result_dict[\'_relative_url\'] = traversed_document.getRelativeUrl()\n
 \n
   # Add a link to the portal type if possible\n
   if not is_portal:\n
     result_dict[\'_links\'][\'type\'] = {\n
       "href": url_template_dict["document_hal"] % {\n
-        "context_url": portal.portal_types[context.getPortalType()].absolute_url(),\n
+        "root_url": site_root.absolute_url(),\n
+        "relative_url": portal.portal_types[traversed_document.getPortalType()]\\\n
+                          .getRelativeUrl(), \n
         "script_id": script.id\n
       },\n
-      "name": context.getPortalType(),\n
+      "name": traversed_document.getPortalType(),\n
     }\n
 \n
   # XXX Loop on form rendering\n
   erp5_action_dict = portal.Base_filterDuplicateActions(\n
-    portal.portal_actions.listFilteredActionsFor(context))\n
+    portal.portal_actions.listFilteredActionsFor(traversed_document))\n
 \n
   embedded_url = None\n
   embedded_action_key = None\n
@@ -384,7 +413,7 @@ elif mode == \'document\':\n
       result_dict[\'_links\']["action_" + erp5_action_key] = erp5_action_list\n
 \n
 #   for view_action in erp5_action_dict.get(\'object_view\', []):\n
-#     context.log(view_action)\n
+#     traversed_document.log(view_action)\n
 #     # XXX Check the action condition\n
 # #     if (view is None) or (view != view_action[\'name\']):\n
 #     object_view_list.append({\n
@@ -392,9 +421,9 @@ elif mode == \'document\':\n
 #       \'name\': view_action[\'name\']\n
 #     })\n
 \n
-#   # XXX Check that context is not the portal\n
-#   if (context.getRelativeUrl() != portal.getRelativeUrl()) and (context.getRelativeUrl() != site_root.getRelativeUrl()):\n
-#     parent = context.getParentValue()\n
+#   # XXX Check that traversed_document is not the portal\n
+#   if (traversed_document.getRelativeUrl() != portal.getRelativeUrl()) and (traversed_document.getRelativeUrl() != site_root.getRelativeUrl()):\n
+#     parent = traversed_document.getParentValue()\n
 #     if (is_web_mode and (parent.getRelativeUrl() != portal.getRelativeUrl())):\n
 #       result_dict[\'_links\'][\'parent\'] = {\n
 #         \'href\': \'%s\' % parent.absolute_url(),\n
@@ -402,24 +431,24 @@ elif mode == \'document\':\n
 #       }\n
 # \n
 #   if (renderer_form is not None):\n
-#     context_property_dict, renderer_form_json = context.Base_renderFormAsSomething(renderer_form)\n
+#     traversed_document_property_dict, renderer_form_json = traversed_document.Base_renderFormAsSomething(renderer_form)\n
 #     result_dict[\'_embedded\'] = {\n
 #       \'object_view\': renderer_form_json\n
 #     }\n
-#     result_dict.update(context_property_dict)\n
+#     result_dict.update(traversed_document_property_dict)\n
 \n
   # XXX XXX XXX XXX\n
   if (embedded_url is not None):\n
-    # XXX Try to fetch the form in the context of the document\n
+    # XXX Try to fetch the form in the traversed_document of the document\n
     # Of course, this code will completely crash in many cases (page template\n
     # instead of form, unexpected action TALES expression). Happy debugging.\n
     # renderer_form_relative_url = view_action[\'url\'][len(portal.absolute_url()):]\n
     form_id = embedded_url.split(\'?\', 1)[0].split("/")[-1]\n
     # XXX Drop (or do something else...) all query parameters (?reset:int=1)\n
-    # renderer_form = context.restrictedTraverse(form_id, None)\n
-    # XXX Proxy field are not correctly handled in context of web site\n
-    renderer_form = getattr(context, form_id)\n
-#     context.log(form_id)\n
+    # renderer_form = traversed_document.restrictedTraverse(form_id, None)\n
+    # XXX Proxy field are not correctly handled in traversed_document of web site\n
+    renderer_form = getattr(traversed_document, form_id)\n
+#     traversed_document.log(form_id)\n
     if (renderer_form is not None):\n
       embedded_dict = {\n
         \'_links\': {\n
@@ -440,11 +469,11 @@ elif mode == \'document\':\n
       for group in renderer_form.Form_getGroupTitleAndId():\n
         for field in renderer_form.get_fields_in_group(group[\'goid\']):\n
           field_id = field.id\n
-#           context.log(field_id)\n
+#           traversed_document.log(field_id)\n
           if field_id.startswith(\'my_\'):\n
             property_name = field_id[len(\'my_\'):]\n
-#             context.log(property_name)\n
-            property_value = context.getProperty(property_name, d=None)\n
+#             traversed_document.log(property_name)\n
+            property_value = traversed_document.getProperty(property_name, d=None)\n
             if (property_value is not None):\n
               if not same_type(property_value, DateTime()):\n
                 # XXX Serialize DateTime\n
@@ -492,7 +521,8 @@ elif mode == \'document\':\n
     if person is not None:\n
       result_dict[\'_links\'][\'me\'] = {\n
         "href": url_template_dict["document_hal"] % {\n
-          "context_url": person.absolute_url(),\n
+          "root_url": site_root.absolute_url(),\n
+          "relative_url": person.getRelativeUrl(), \n
           "script_id": script.id\n
         },\n
         \'_relative_url\': person.getRelativeUrl()\n
@@ -513,11 +543,11 @@ elif mode == \'document\':\n
     }\n
 \n
   else:\n
-    context_portal_type = context.getPortalType()\n
-    if context_portal_type == "Person":\n
+    traversed_document_portal_type = traversed_document.getPortalType()\n
+    if traversed_document_portal_type == "Person":\n
       query = sql_catalog.buildQuery({\n
           "portal_type": "Hosting Subscription",\n
-          "default_destination_section_uid": context.getUid(),\n
+          "default_destination_section_uid": traversed_document.getUid(),\n
           "validation_state": \'validated\'\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
@@ -534,7 +564,7 @@ elif mode == \'document\':\n
       query = sql_catalog.buildQuery({\n
           "portal_type": "Computer",\n
           "local_roles": "Assignee",\n
-          "default_strict_allocation_scope_uid": "!=%s" % context.getPortalObject().portal_categories.allocation_scope.close.forever.getUid(),\n
+          "default_strict_allocation_scope_uid": "!=%s" % traversed_document.getPortalObject().portal_categories.allocation_scope.close.forever.getUid(),\n
           "validation_state": \'validated\'\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
@@ -565,7 +595,7 @@ elif mode == \'document\':\n
       # List of invoices\n
       query = sql_catalog.buildQuery({\n
           "portal_type": "Sale Invoice Transaction",\n
-          "default_destination_section_uid": context.getUid(),\n
+          "default_destination_section_uid": traversed_document.getUid(),\n
           "query": NegatedQuery(Query(title="Reversal Transaction for %")),\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
@@ -581,7 +611,7 @@ elif mode == \'document\':\n
       # List of tickets\n
       query = sql_catalog.buildQuery({\n
           "portal_type": ["Support Request", "Regularisation Request"],\n
-          "default_destination_decision_uid": context.getUid(),\n
+          "default_destination_decision_uid": traversed_document.getUid(),\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
         "mode": "search",\n
@@ -594,27 +624,27 @@ elif mode == \'document\':\n
       })\n
 \n
       action_dict[\'request\'] = {\n
-        \'href\': "%s/Person_requestInstanceFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Person_requestInstanceFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'request_computer\'] = {\n
-        \'href\': "%s/Person_requestComputerFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Person_requestComputerFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'request_computer_network\'] = {\n
-        \'href\': "%s/Person_requestComputerNetworkFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Person_requestComputerNetworkFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'request_ticket\'] = {\n
-        \'href\': "%s/Person_requestTicketFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Person_requestTicketFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
 \n
-    elif context_portal_type == "Hosting Subscription":\n
+    elif traversed_document_portal_type == "Hosting Subscription":\n
       # Link to all ongoing Hosting Subscriptions\n
       query = sql_catalog.buildQuery({\n
           "portal_type": ["Software Instance", "Slave Instance"],\n
-          "default_specialise_uid": context.getUid(),\n
+          "default_specialise_uid": traversed_document.getUid(),\n
           "validation_state": \'validated\'\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
@@ -629,29 +659,29 @@ elif mode == \'document\':\n
 \n
       # Actions to modify the hosting subscription\n
       action_dict[\'start\'] = {\n
-        \'href\': "%s/HostingSubscription_changeRequestedStateFromJio?action=started" % context.absolute_url(),\n
+        \'href\': "%s/HostingSubscription_changeRequestedStateFromJio?action=started" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'stop\'] = {\n
-        \'href\': "%s/HostingSubscription_changeRequestedStateFromJio?action=stopped" % context.absolute_url(),\n
+        \'href\': "%s/HostingSubscription_changeRequestedStateFromJio?action=stopped" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'destroy\'] = {\n
-        \'href\': "%s/HostingSubscription_changeRequestedStateFromJio?action=destroyed" % context.absolute_url(),\n
+        \'href\': "%s/HostingSubscription_changeRequestedStateFromJio?action=destroyed" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
 \n
-    elif context_portal_type == "Software Installation":\n
+    elif traversed_document_portal_type == "Software Installation":\n
       action_dict[\'destroy\'] = {\n
-        \'href\': "%s/SoftwareInstallation_destroyFromJio" % context.absolute_url(),\n
+        \'href\': "%s/SoftwareInstallation_destroyFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
 \n
-    elif context_portal_type == "Software Product":\n
+    elif traversed_document_portal_type == "Software Product":\n
       # Link to all Software Releases\n
       query = sql_catalog.buildQuery({\n
           "portal_type": "Software Release",\n
-          "default_aggregate_uid": context.getUid(),\n
+          "default_aggregate_uid": traversed_document.getUid(),\n
           "validation_state": ["shared", "shared_alive", "released", "released_alive", "published", "published_alive"]\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
@@ -664,11 +694,11 @@ elif mode == \'document\':\n
         \'_query\': query\n
       }\n
 \n
-    elif context_portal_type == "Computer":\n
+    elif traversed_document_portal_type == "Computer":\n
       # Link to related Software Installation\n
       query = sql_catalog.buildQuery({\n
           "portal_type": "Software Installation",\n
-          "default_aggregate_uid": context.getUid(),\n
+          "default_aggregate_uid": traversed_document.getUid(),\n
           "validation_state": "validated"\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
@@ -682,32 +712,32 @@ elif mode == \'document\':\n
       }\n
 \n
       action_dict[\'update_allocation_scope\'] = {\n
-        \'href\': "%s/Computer_updateAllocationScopeFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Computer_updateAllocationScopeFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'generate_certificate\'] = {\n
-        \'href\': "%s/Computer_requestNewComputerCertificateFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Computer_requestNewComputerCertificateFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'revoke_certificate\'] = {\n
-        \'href\': "%s/Computer_revokeComputerCertificateFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Computer_revokeComputerCertificateFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
       action_dict[\'request_installation\'] = {\n
-        \'href\': "%s/Person_requestInstallationFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Person_requestInstallationFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
 \n
-    elif context_portal_type == "Sale Invoice Transaction":\n
+    elif traversed_document_portal_type == "Sale Invoice Transaction":\n
       result_dict[\'_links\'][\'slapos_jump\'] = {\n
-        "href": "%s/SaleInvoiceTransaction_viewSlapOSPrintout" % context.absolute_url(),\n
+        "href": "%s/SaleInvoiceTransaction_viewSlapOSPrintout" % traversed_document.absolute_url(),\n
         \'name\': \'current_printout\',\n
       }\n
 \n
-    elif context_portal_type in ["Support Request", "Regularisation Request"]:\n
+    elif traversed_document_portal_type in ["Support Request", "Regularisation Request"]:\n
       # Link to all Events\n
       query = sql_catalog.buildQuery({\n
-          "default_follow_up_uid": context.getUid(),\n
+          "default_follow_up_uid": traversed_document.getUid(),\n
         }).asSearchTextExpression(sql_catalog)\n
       http_query = make_query({\n
         "mode": "search",\n
@@ -720,9 +750,12 @@ elif mode == \'document\':\n
       }\n
 \n
       action_dict[\'update\'] = {\n
-        \'href\': "%s/Ticket_updateFromJio" % context.absolute_url(),\n
+        \'href\': "%s/Ticket_updateFromJio" % traversed_document.absolute_url(),\n
         \'method\': \'POST\'\n
       }\n
+\n
+    elif traversed_document_portal_type == "Form":\n
+      renderFormDefinition(traversed_document, result_dict)\n
 \n
   # Define document action\n
   if action_dict:\n
@@ -738,7 +771,7 @@ elif mode == \'search\':\n
     return ""\n
   # XXX\n
   length = len(\'/%s/\' % portal.getId())\n
-  sql_list = context.portal_catalog(full_text=query, limit=limit)\n
+  sql_list = portal.portal_catalog(full_text=query, limit=limit)\n
   result_list = []\n
 \n
   if (select_list is None):\n
@@ -747,7 +780,8 @@ elif mode == \'search\':\n
       document = sql_document.getObject()\n
       result_list.append({\n
         "href": url_template_dict["document_hal"] % {\n
-          "context_url": document.absolute_url(),\n
+          "root_url": site_root.absolute_url(),\n
+          "relative_url": document.getRelativeUrl(), \n
           "script_id": script.id\n
         },\n
       })\n
@@ -761,7 +795,8 @@ elif mode == \'search\':\n
         \'_links\': {\n
           \'self\': {\n
             "href": url_template_dict["document_hal"] % {\n
-              "context_url": document.absolute_url(),\n
+              "root_url": site_root.absolute_url(),\n
+              "relative_url": document.getRelativeUrl(), \n
               "script_id": script.id\n
             },\n
           },\n
@@ -801,16 +836,16 @@ elif mode == \'form\':\n
   renderForm(form, result_dict)\n
 \n
 \n
-elif mode == \'form_definition\':\n
-  #################################################\n
-  # Get raw form definitions\n
-  #################################################\n
-  if REQUEST.other[\'method\'] != "GET":\n
-    response.setStatus(405)\n
-    return ""\n
-\n
-  form = getattr(portal, skin_id)\n
-  renderFormDefinition(form, result_dict)\n
+# elif mode == \'form_definition\':\n
+#   #################################################\n
+#   # Get raw form definitions\n
+#   #################################################\n
+#   if REQUEST.other[\'method\'] != "GET":\n
+#     response.setStatus(405)\n
+#     return ""\n
+# \n
+#   form = getattr(portal, skin_id)\n
+#   renderFormDefinition(form, result_dict)\n
 \n
 else:\n
   raise NotImplementedError, "Unsupported mode %s" % mode\n
@@ -823,7 +858,7 @@ return json.dumps(result_dict, indent=2)\n
         </item>
         <item>
             <key> <string>_params</string> </key>
-            <value> <string>REQUEST=None, response=None, view=None, mode=\'document\', query=None, select_list=None, limit=None, form=None, skin_id=None</string> </value>
+            <value> <string>REQUEST=None, response=None, view=None, mode=\'root\', query=None, select_list=None, limit=None, form=None, relative_url=None</string> </value>
         </item>
         <item>
             <key> <string>id</string> </key>
diff --git a/master/bt5/slapos_jio/bt/revision b/master/bt5/slapos_jio/bt/revision
index 62f9457511f879886bb7728c986fe10b0ece6bcb..c7930257dfef505fd996e1d6f22f2f35149990d0 100644
--- a/master/bt5/slapos_jio/bt/revision
+++ b/master/bt5/slapos_jio/bt/revision
@@ -1 +1 @@
-6
\ No newline at end of file
+7
\ No newline at end of file