diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_reportUpgraderBusinessTemplateDiff.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_reportUpgraderBusinessTemplateDiff.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c1f7cd613baa3e69f207723397ffbb1cca2b80ed
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_reportUpgraderBusinessTemplateDiff.xml
@@ -0,0 +1,109 @@
+<?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># This script comes with Base_gitDiffWithZODBAsText.\n
+# It should be ran in an alarm thank to a property sheet constraint.\n
+# Where does this script should be commited?\n
+from Products.ZSQLCatalog.SQLCatalog import SimpleQuery\n
+\n
+if fixit:\n
+  return ["Cannot fix automatically, please do it manually. (Or deactivate the constraint to force upgrade.)"]\n
+\n
+portal = context.getPortalObject()\n
+\n
+bt_title_list, keep_bt_title_list = context.Base_getUpgradeBusinessTemplateList()\n
+keep_bt_title_set = set(keep_bt_title_list)\n
+bt_title_list = [\n
+  title\n
+  for _, title in portal.portal_templates.resolveBusinessTemplateListDependency(bt_title_list)\n
+  if title not in keep_bt_title_set\n
+]\n
+\n
+bt_list = [\n
+  bt\n
+  for bt in portal.portal_catalog(\n
+    portal_type="Business Template",\n
+    query=SimpleQuery(title=bt_title_list, comparison_operator=\'=\'),\n
+  )\n
+  if bt.getInstallationState() == "installed"\n
+]\n
+\n
+#bt_list = [\n
+#  x.getObject()\n
+#  for x in portal.portal_catalog(\n
+#    portal_type="Business Template",\n
+#    installation_state="installed",\n
+#  )\n
+#  if x.getInstallationState() == "installed"\n
+#]\n
+\n
+diff_list = []\n
+for bt in bt_list:\n
+  diff = bt.BusinessTemplate_getDiffWithZODBAsText()\n
+  if diff:\n
+    diff_list += ["===== %s =====" % bt.getTitle()] + diff.splitlines()\n
+\n
+return diff_list\n
+</string> </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>fixit=False, **kw</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>Base_reportUpgraderBusinessTemplateDiff</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_getDiffWithZODBAsText.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_getDiffWithZODBAsText.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2a0fe6037bbaad3f755a8a4dd318d20cd7b6266c
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_getDiffWithZODBAsText.xml
@@ -0,0 +1,138 @@
+<?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 encoding="cdata"><![CDATA[
+
+# This script comes with Base_reportUpgraderBunisessTemplateDiff.\n
+# It can be ran individualy, of course.\n
+# Where does this script should be commited? erp5_core?\n
+# This diff script clones and builds it\'s own bt for comparision,\n
+# check with other script why this is not already done. Like on\n
+# TemplateTool_getDetailedDiff in erp5_core portal skin.\n
+from Products.ERP5Type.Document import newTempBase\n
+from ZODB.POSException import ConflictError\n
+\n
+template_tool = context.getPortalObject().portal_templates\n
+\n
+assert context.getBuildingState() == "built", "%s != \'built\'" % repr(context.getBuildingState())\n
+\n
+def getDiffObjectList(business_template, installed_bt_for_diff):\n
+  # business_template is assumed built and installed\n
+  modified_object_list = business_template.preinstall(check_dependencies=0, compare_to=installed_bt_for_diff)\n
+  keys = modified_object_list.keys()\n
+  #keys.sort() # XXX don\'t care ?\n
+  bt_id = business_template.getId()\n
+  i = 0\n
+  object_list = []\n
+  for object_id in keys:\n
+    object_state, object_class = modified_object_list[object_id]\n
+    line = newTempBase(template_tool, \'tmp_install_%s\' % (str(i))) # template_tool or context?\n
+    line.edit(object_id=object_id, object_state=object_state, object_class=object_class, bt1=bt_id, bt2=bt_id)\n
+    line.setUid(\'new_%s\' % object_id)\n
+    object_list.append(line)\n
+    i += 1\n
+  return object_list\n
+\n
+def getSortedDiffObjectList(business_template, installed_bt_for_diff):\n
+  return sorted(\n
+    sorted(\n
+      getDiffObjectList(business_template, installed_bt_for_diff),\n
+      key=lambda x: x.object_id\n
+    ),\n
+    key=lambda x: x.object_state\n
+  )\n
+\n
+\n
+try:\n
+  installed_bt_for_diff = context.Base_createCloneDocument(clone=1, batch_mode=1)\n
+except ConflictError:\n
+  raise\n
+except Exception as e:\n
+  print(e)\n
+  return printed #.split("\\n")\n
+\n
+name = "installed_bt_for_diff"\n
+try:\n
+  installed_bt_for_diff.setId(name)\n
+  installed_bt_for_diff.build()\n
+  for diff_object in getSortedDiffObjectList(context, installed_bt_for_diff):\n
+    print("%s (%s) -> %s" % (diff_object.object_state, diff_object.object_class, diff_object.object_id))\n
+    # Just uncomment these lines below to append diff to the text\n
+    #if diff_object.object_state != "Modified":\n
+    #  continue\n
+    #print(context.diffObject(diff_object, compare_with=name).lstrip())\n
+    #print("")\n
+except ConflictError:\n
+  raise\n
+except Exception as e:\n
+  print(e)\n
+finally:\n
+  template_tool.manage_delObjects(ids=[installed_bt_for_diff.getId()])\n
+\n
+#return "<pre>" + printed.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\\"", "&quot;") + "</pre>"\n
+return printed #.split("\\n")\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>BusinessTemplate_getDiffWithZODBAsText</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>