diff --git a/bt5/erp5_web_manifest/RegisteredSkinSelectionTemplateItem/registered_skin_selection.xml b/bt5/erp5_web_manifest/RegisteredSkinSelectionTemplateItem/registered_skin_selection.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ca2680407c1cde9a158113a833e7b1cb8ed3e93c
--- /dev/null
+++ b/bt5/erp5_web_manifest/RegisteredSkinSelectionTemplateItem/registered_skin_selection.xml
@@ -0,0 +1,6 @@
+<registered_skin_selection>
+ <skin_folder_selection>
+  <skin_folder>manifest_renderjs_ui</skin_folder>
+  <skin_selection>Manifest</skin_selection>
+ </skin_folder_selection>
+</registered_skin_selection>
\ No newline at end of file
diff --git a/bt5/erp5_web_manifest/SkinTemplateItem/portal_skins/manifest_renderjs_ui.xml b/bt5/erp5_web_manifest/SkinTemplateItem/portal_skins/manifest_renderjs_ui.xml
new file mode 100644
index 0000000000000000000000000000000000000000..af0b453846cc6743eb6848ea15ab8a9297a8c8f3
--- /dev/null
+++ b/bt5/erp5_web_manifest/SkinTemplateItem/portal_skins/manifest_renderjs_ui.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Folder" module="OFS.Folder"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_local_properties</string> </key>
+            <value>
+              <tuple>
+                <dictionary>
+                  <item>
+                      <key> <string>id</string> </key>
+                      <value> <string>business_template_skin_layer_priority</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>type</string> </key>
+                      <value> <string>float</string> </value>
+                  </item>
+                </dictionary>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_objects</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>business_template_skin_layer_priority</string> </key>
+            <value> <float>99.9</float> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>manifest_renderjs_ui</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>manifest data retrieval</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_web_manifest/SkinTemplateItem/portal_skins/manifest_renderjs_ui/WebPage_viewAsWeb.xml b/bt5/erp5_web_manifest/SkinTemplateItem/portal_skins/manifest_renderjs_ui/WebPage_viewAsWeb.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e2c913202d8e928f27e048721d44c00cc8aa790a
--- /dev/null
+++ b/bt5/erp5_web_manifest/SkinTemplateItem/portal_skins/manifest_renderjs_ui/WebPage_viewAsWeb.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_body</string> </key>
+            <value> <string>if REQUEST is None:\n
+  REQUEST = context.REQUEST\n
+if response is None:\n
+  response = REQUEST.RESPONSE\n
+\n
+web_page = context\n
+\n
+if REQUEST.getHeader(\'If-Modified-Since\', \'\') == web_page.getModificationDate().rfc822():\n
+  response.setStatus(304)\n
+  return ""\n
+\n
+portal_type = web_page.getPortalType()\n
+web_content = web_page.getTextContent()\n
+\n
+# set headers depending on type of script\n
+if (portal_type == "Web Script"):\n
+  response.setHeader(\'Content-Type\', \'application/javascript\')\n
+\n
+elif (portal_type == "Web Style"):\n
+  response.setHeader(\'Content-Type\', \'text/css\')\n
+\n
+elif (portal_type == "Web Manifest"):\n
+  response.setHeader(\'Content-Type\', \'text/cache-manifest\')\n
+\n
+else:\n
+  if (mapping_dict is not None):\n
+    web_content = web_page.TextDocument_substituteTextContent(web_page, web_content, mapping_dict=mapping_dict)\n
+  # Do not allow to put inside an iframe\n
+  response.setHeader("X-Frame-Options", "SAMEORIGIN")\n
+  response.setHeader("X-Content-Type-Options", "nosniff")\n
+\n
+  # Only fetch code (html, js, css, image) and data from this ERP5, to prevent any data leak as the web site do not control the gadget\'s code\n
+  response.setHeader("Content-Security-Policy", "default-src \'none\'; img-src \'self\' data:; media-src \'self\'; connect-src \'self\'; script-src \'self\' \'unsafe-eval\'; font-src netdna.bootstrapcdn.com fonts.googleapis.com fonts.gstatic.com; style-src \'self\' netdna.bootstrapcdn.com fonts.googleapis.com fonts.gstatic.com \'unsafe-inline\' data:; frame-src \'self\' https://jsbin.com data:;")\n
+\n
+  response.setHeader(\'Content-Type\', \'text/html\')\n
+\n
+return web_content\n
+</string> </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>REQUEST=None, response=None, mapping_dict=None</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>WebPage_viewAsWeb</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_web_manifest/bt/template_registered_skin_selection_list b/bt5/erp5_web_manifest/bt/template_registered_skin_selection_list
new file mode 100644
index 0000000000000000000000000000000000000000..30df6cfa55ac7fef4593d6b934b5bcac086094a0
--- /dev/null
+++ b/bt5/erp5_web_manifest/bt/template_registered_skin_selection_list
@@ -0,0 +1 @@
+manifest_renderjs_ui | Manifest
\ No newline at end of file
diff --git a/bt5/erp5_web_manifest/bt/template_skin_id_list b/bt5/erp5_web_manifest/bt/template_skin_id_list
new file mode 100644
index 0000000000000000000000000000000000000000..e177db440d3b245ccacae97354f558f48db17a65
--- /dev/null
+++ b/bt5/erp5_web_manifest/bt/template_skin_id_list
@@ -0,0 +1 @@
+manifest_renderjs_ui
\ No newline at end of file