diff --git a/bt5/erp5_core_test/MixinTemplateItem/portal_components/mixin.erp5.TestWorkflowMixin.xml b/bt5/erp5_core_test/MixinTemplateItem/portal_components/mixin.erp5.TestWorkflowMixin.xml
index 5fab714fcbf5fbb980e0d42df49e3432d1186293..f864b36f204d9b9ab2fb1e2c9e5da7f24ec3a6a4 100644
--- a/bt5/erp5_core_test/MixinTemplateItem/portal_components/mixin.erp5.TestWorkflowMixin.xml
+++ b/bt5/erp5_core_test/MixinTemplateItem/portal_components/mixin.erp5.TestWorkflowMixin.xml
@@ -100,24 +100,28 @@
   </record>
   <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
     <pickle>
-      <tuple>
-        <none/>
-        <list>
-          <dictionary>
-            <item>
-                <key> <string>action</string> </key>
-                <value> <string>validate</string> </value>
-            </item>
-            <item>
-                <key> <string>validation_state</string> </key>
-                <value> <string>validated</string> </value>
-            </item>
-          </dictionary>
-        </list>
-      </tuple>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>validate</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>validation_state</string> </key>
+                      <value> <string>validated</string> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
     </pickle>
   </record>
 </ZopeData>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.py
index 3076d6b65923bf664279dadfb33f15817d4f8faf..8ee9e7982cda2a8447f39163716a861d75b0d850 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.py
@@ -79,7 +79,7 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional):
     """
     return ('erp5_base',)
 
-  def login(self):
+  def login(self): # pylint:disable=arguments-differ
     uf = self.getPortal().acl_users
     uf._doAddUser(self.username, '', ['Manager'], [])
     user = uf.getUserById(self.username).__of__(uf)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.xml
index 88a037a0df4ebb9a00b4d8c3038a9a7637d78e26..579c8a47e60921985b9eb0cdfc1d3e31eb028551 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBase.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testBase</string> </value>
@@ -43,11 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 82,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-                <string>W:951, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1034, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -57,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -76,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -85,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.py
index 822d50cbf8800f7519213759be330e109fe99443..fab263112dfbc472f38a00b6addc00b709f91ea4 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.py
@@ -42,7 +42,6 @@ from Products.ERP5Type.tests.utils import LogInterceptor
 from Products.ERP5Type.Workflow import addWorkflowByType
 import shutil
 import os
-import gc
 import random
 import string
 import tempfile
@@ -65,7 +64,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
             )
   ## Ignore errors from PortalTransforms (e.g. missing binaries)
 
-  def _catch_log_errors(self):
+  def _catch_log_errors(self):  # pylint:disable=arguments-differ
     LogInterceptor._catch_log_errors(self)
     level = self.level
     def _tr_init(*args, **kw):
@@ -82,7 +81,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
         assert self.output == 'BROKEN'
     Transform.manage_beforeDelete = manage_beforeDelete
 
-  def _ignore_log_errors(self):
+  def _ignore_log_errors(self):  # pylint:disable=arguments-differ
     Transform._tr_init = Transform_tr_init
     Transform.manage_beforeDelete = Transform_manage_beforeDelete
     LogInterceptor._ignore_log_errors(self)
@@ -127,10 +126,6 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     for d in getattr(self, "rmdir_list", ()):
       shutil.rmtree(d)
 
-    pw = self.getWorkflowTool()
-
-    props = {}
-
     for type_object in self.getTypesTool().listTypeInfo():
       workflow_list = type_object.getTypeWorkflowList()
       if 'geek_workflow' in workflow_list:
@@ -421,8 +416,8 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     trash = self.getTrashTool()
     trash_ids = list(trash.objectIds())
-    for id in trash_ids:
-      trash.deleteContent(id)
+    for id_ in trash_ids:
+      trash.deleteContent(id_)
     self.assertFalse(len(trash.objectIds()) > 0)
 
   def stepCheckTrashBin(self, sequence=None, **kw):
@@ -600,21 +595,21 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     Create Module with objects
     """
     portal = self.getPortal()
-    id = 'geek_module'
+    id_ = 'geek_module'
     n = 0
-    while id in portal.objectIds():
+    while id_ in portal.objectIds():
       n = n + 1
-      id = "%s_%s" %('geek_module', n)
-    module = portal.newContent(id=id, portal_type='Geek Module')
+      id_ = "%s_%s" % ('geek_module', n)
+    module = portal.newContent(id=id_, portal_type='Geek Module')
     self.assertTrue(module is not None)
     # add a specific permission to module which do not use acquisition
     module.manage_permission('Copy or Move', ['Assignor'], False)
     sequence.edit(module_id=module.getId())
     module_object_list = []
-    for i in xrange(10):
-      object = module.newContent(portal_type = 'Geek Object')
-      self.assertTrue(object is not None)
-      module_object_list.append(object)
+    for _ in xrange(10):
+      obj = module.newContent(portal_type = 'Geek Object')
+      self.assertIsNotNone(obj)
+      module_object_list.append(obj)
     sequence.edit(module_object_id_list=module_object_list)
 
   def stepAddModuleToBusinessTemplate(self, sequence=None, **kw):
@@ -623,7 +618,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     bt = sequence.get('current_bt', None)
     module_id = sequence.get('module_id', None)
-    self.assertTrue(module_id is not None)
+    self.assertIsNotNone(module_id)
     bt.edit(template_module_id_list=[module_id])
 
   def stepCreateModuleObjects(self, sequence=None, **kw):
@@ -633,12 +628,12 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     portal = self.getPortal()
     module_id = sequence.get('module_id')
     module = portal._getOb(module_id, None)
-    self.assertTrue(module is not None)
+    self.assertIsNotNone(module)
     module_object_list = []
-    for i in xrange(10):
-      object = module.newContent(portal_type = 'Geek Object')
-      self.assertTrue(object is not None)
-      module_object_list.append(object.getId())
+    for _ in xrange(10):
+      obj = module.newContent(portal_type = 'Geek Object')
+      self.assertIsNotNone(obj)
+      module_object_list.append(obj.getId())
     sequence.edit(module_object_id_list=module_object_list)
 
   def stepRemoveModule(self, sequence=None, **kw):
@@ -648,7 +643,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     portal = self.getPortal()
     module_id = sequence.get("module_id")
     portal.manage_delObjects([module_id])
-    self.assertFalse(portal._getOb(module_id, None) is not None)
+    self.assertIsNone(portal._getOb(module_id, None))
 
   def stepCheckModuleExists(self, sequence=None, **kw):
     """
@@ -657,7 +652,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     portal = self.getPortal()
     module_id = sequence.get("module_id")
     new_module = portal._getOb(module_id, None)
-    self.assertFalse(new_module is None)
+    self.assertIsNotNone(new_module)
 
   def stepCheckModulePermissions(self, sequence=None, **kw):
     """
@@ -687,11 +682,10 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     portal = self.getPortal()
     module_id = sequence.get('module_id')
     module = portal._getOb(module_id)
-    self.assertTrue(module is not None)
+    self.assertIsNotNone(module)
     object_id_list = sequence.get('module_object_id_list')
     for object_id in object_id_list:
-      object = module._getOb(object_id, None)
-      self.assertTrue(object is not None)
+      self.assertIsNotNone(module._getOb(object_id, None))
 
   def stepCheckModuleObjectsRemoved(self, sequence=None, **kw):
     """
@@ -703,8 +697,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertTrue(module is not None)
     object_id_list = sequence.get('module_object_id_list')
     for object_id in object_id_list:
-      object = module._getOb(object_id, None)
-      self.assertTrue(object is None)
+      self.assertIsNone(module._getOb(object_id, None))
 
   def stepCheckModuleRemoved(self, sequence=None, **kw):
     """
@@ -712,7 +705,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     portal = self.getPortal()
     module_id = sequence.get("module_id")
-    self.assertFalse(portal._getOb(module_id, None) is not None)
+    self.assertIsNone(portal._getOb(module_id, None))
 
   # skins folder
   def stepCreateSkinFolder(self, sequence=None, **kw):
@@ -722,7 +715,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     ps = self.getSkinsTool()
     ps.manage_addProduct['OFSP'].manage_addFolder('erp5_geek')
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertTrue(skin_folder is not None)
+    self.assertIsNotNone(skin_folder)
     sequence.edit(skin_folder_id=skin_folder.getId())
     # add skin in layers
     for skin_name, selection in ps.getSkinPaths():
@@ -738,7 +731,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     ps = self.getSkinsTool()
     ps.manage_addProduct['OFSP'].manage_addFolder('erp5_nerd')
     skin_folder = ps._getOb('erp5_nerd', None)
-    self.assertTrue(skin_folder is not None)
+    self.assertIsNotNone(skin_folder)
     sequence.edit(another_skin_folder_id=skin_folder.getId())
     # add skin in layers
     for skin_name, selection in ps.getSkinPaths():
@@ -754,7 +747,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     ps = self.getSkinsTool()
     ps.manage_addProduct['OFSP'].manage_addFolder('erp5_static')
     skin_folder = ps._getOb('erp5_static', None)
-    self.assertTrue(skin_folder is not None)
+    self.assertIsNotNone(skin_folder)
     sequence.edit(static_skin_folder_id=skin_folder.getId())
     # add skin in layers
     for skin_name, selection in ps.getSkinPaths():
@@ -767,10 +760,10 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
   def stepCreateSkinSubFolder(self, sequence=None, **kw):
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertTrue(skin_folder is not None)
+    self.assertIsNotNone(skin_folder)
     skin_folder.manage_addFolder('erp5_subgeek')
     skin_subfolder = skin_folder._getOb('erp5_subgeek', None)
-    self.assertTrue(skin_subfolder is not None)
+    self.assertIsNotNone(skin_subfolder)
     sequence.edit(skin_subfolder_id=skin_subfolder.getId())
 
   def stepCheckSkinSubFolderExists(self, sequence=None, **kw):
@@ -780,21 +773,21 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     ps = self.getSkinsTool()
     skin_id = sequence.get('skin_folder_id')
     skin_folder = ps._getOb(skin_id, None)
-    self.assertTrue(skin_folder is not None)
+    self.assertIsNotNone(skin_folder)
     subskin_id = sequence.get('skin_subfolder_id')
     skin_subfolder = skin_folder._getOb(subskin_id, None)
-    self.assertTrue(skin_subfolder is not None)
+    self.assertIsNotNone(skin_subfolder)
 
   def stepCreateNewForm(self, sequence=None):
     """Create a new ERP5 Form in a skin folder."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = 'Geek_view'
     addERP5Form = skin_folder.manage_addProduct['ERP5Form'].addERP5Form
     addERP5Form(form_id, 'View')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     self.assertEqual(sorted(form.get_groups(include_empty=1)),
                       sorted(['left', 'right', 'center', 'bottom', 'hidden']))
     addField = form.manage_addProduct['Formulator'].manage_addField
@@ -813,12 +806,12 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """Create a new ERP5 Form in a skin folder."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_nerd', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = 'Geek_view'
     addERP5Form = skin_folder.manage_addProduct['ERP5Form'].addERP5Form
     addERP5Form(form_id, 'View')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     self.assertEqual(sorted(form.get_groups(include_empty=1)),
                       sorted(['left', 'right', 'center', 'bottom', 'hidden']))
     addField = form.manage_addProduct['Formulator'].manage_addField
@@ -837,22 +830,22 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """Remove an ERP5 Form."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     skin_folder.manage_delObjects([form_id])
     form = skin_folder._getOb(form_id, None)
-    self.assertEqual(form, None)
+    self.assertIsNone(form)
 
   def stepAddFormField(self, sequence=None):
     """Add a field to an ERP5 Form."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     self.assertEqual(sorted(form.get_groups(include_empty=1)),
                       sorted(['left', 'right', 'center', 'bottom', 'hidden']))
     addField = form.manage_addProduct['Formulator'].manage_addField
@@ -871,12 +864,12 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
   def stepModifyFormTitle(self, sequence=None):
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
     form_title = 'First Form Title'
     form.title = form_title
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     self.assertEqual(sorted(form.get_groups(include_empty=1)),
                       sorted(['left', 'right', 'center', 'bottom', 'hidden']))
     group_dict = {}
@@ -891,7 +884,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
   def stepRevertFormTitle(self, sequence=None):
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
     form_title = 'Second Form Title'
@@ -900,7 +893,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
   def stepCheckFormTitle(self, sequence=None):
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
     self.assertEqual('First Form Title', form.title)
@@ -909,7 +902,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """Check the form is exist in erp5_geek."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
     self.assertEqual(form, None)
@@ -918,19 +911,19 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """Check the form is not exist in erp5_nerd."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_nerd', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
 
   def stepRemoveFormField(self, sequence=None):
     """Remove a field from an ERP5 Form."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     field_id = sequence.get('field_id')
     field = form.get_field(field_id)
     self.assertNotEquals(field, None)
@@ -941,10 +934,10 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """Check the groups of an ERP5 Form."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_geek', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     group_dict = sequence.get('group_dict')
     self.assertEqual(sorted(form.get_groups(include_empty=1)),
                       sorted(group_dict.iterkeys()))
@@ -958,10 +951,10 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """Check that field title is not removed form erp5_nerd."""
     ps = self.getSkinsTool()
     skin_folder = ps._getOb('erp5_nerd', None)
-    self.assertNotEquals(skin_folder, None)
+    self.assertIsNotNone(skin_folder)
     form_id = sequence.get('form_id')
     form = skin_folder._getOb(form_id, None)
-    self.assertNotEquals(form, None)
+    self.assertIsNotNone(form)
     title_field =form._getOb('my_title', None)
     self.assertNotEquals(title_field, None)
 
@@ -1185,9 +1178,8 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     base_category = pc._getOb(bc_id, None)
     self.assertTrue(base_category is not None)
     category_list = []
-    for i in xrange(10):
+    for _ in xrange(10):
       category = base_category.newContent(portal_type='Category')
-      self.assertTrue(category is not None)
       category_list.append(category.getId())
     sequence.edit(category_id_list=category_list)
 
@@ -1253,9 +1245,8 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertTrue(category is not None)
     subcategory_list = []
     subcategory_uid_dict = {}
-    for i in xrange(10):
+    for _ in xrange(10):
       subcategory = category.newContent(portal_type='Category', title='toto')
-      self.assertTrue(subcategory is not None)
       subcategory_list.append(subcategory.getId())
       subcategory_uid_dict[subcategory.getId()] = subcategory.getUid()
     sequence.edit(subcategory_id_list=subcategory_list, \
@@ -1430,8 +1421,8 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     wf_id = sequence.get('workflow_id')
     tt = self.getPortal()['portal_trash']
     self.assertEqual(len(tt.objectIds()), 1)
-    bin = tt.objectValues()[0]
-    self.assertNotEqual(len(bin.portal_workflow_items[wf_id].objectIds()), 0)
+    trash_bin = tt.objectValues()[0]
+    self.assertNotEqual(len(trash_bin.portal_workflow_items[wf_id].objectIds()), 0)
 
   # Actions
   def stepCreateFirstAction(self, sequence=None, **kw):
@@ -1666,11 +1657,11 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertIn(method_id, catalog.sql_uncatalog_object)
     # check filter
     filter_dict = catalog._getFilterDict()
-    filter = filter_dict[method_id]
-    self.assertItemsEqual(filter['expression_cache_key'], ['portal_type'])
-    self.assertEqual(filter['type'], [])
-    self.assertEqual(filter['filtered'], 1)
-    self.assertEqual(filter['expression'], 'python: context.isPredicate()')
+    filter_ = filter_dict[method_id]
+    self.assertItemsEqual(filter_['expression_cache_key'], ['portal_type'])
+    self.assertEqual(filter_['type'], [])
+    self.assertEqual(filter_['filtered'], 1)
+    self.assertEqual(filter_['expression'], 'python: context.isPredicate()')
 
   def stepCheckUpdatedCatalogMethodExists(self, sequence=None, **kw):
     pc = self.getCatalogTool()
@@ -1683,11 +1674,11 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertIn(method_id, catalog.sql_uncatalog_object)
     # check filter
     filter_dict = catalog._getFilterDict()
-    filter = filter_dict[method_id]
-    self.assertItemsEqual(filter['expression_cache_key'], ['portal_type'])
-    self.assertEqual(filter['type'], [])
-    self.assertEqual(filter['filtered'], 1)
-    self.assertEqual(filter['expression'], 'python: context.isDelivery()')
+    filter_ = filter_dict[method_id]
+    self.assertItemsEqual(filter_['expression_cache_key'], ['portal_type'])
+    self.assertEqual(filter_['type'], [])
+    self.assertEqual(filter_['filtered'], 1)
+    self.assertEqual(filter_['expression'], 'python: context.isDelivery()')
 
   def stepCheckCatalogMethodRemoved(self, sequence=None, **kw):
     """
@@ -1703,7 +1694,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertNotIn(method_id, catalog.sql_uncatalog_object)
     # check filter
     with self.assertRaises(KeyError):
-      catalog._getFilterDict()[method_id]
+      _ = catalog._getFilterDict()[method_id]
 
   def stepRemoveCatalogMethod(self, sequence=None, **kw):
     """
@@ -1724,7 +1715,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertNotIn(method_id, catalog.sql_uncatalog_object)
     # remove filter
     with self.assertRaises(KeyError):
-      catalog._getFilterDict()[method_id]
+      _ = catalog._getFilterDict()[method_id]
 
   # Related key, Result key and table, and others
   def stepCreateKeysAndTable(self, sequence=list, **kw):
@@ -2391,9 +2382,9 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     Add Property Sheet to Business Template
     """
     bt = sequence.get('current_bt', None)
-    self.assertTrue(bt is not None)
+    self.assertIsNotNone(bt)
     ps_title = sequence.get('ps_title', None)
-    self.assertTrue(ps_title is not None)
+    self.assertIsNotNone(ps_title)
     bt.edit(template_property_sheet_id_list=[ps_title])
 
   def stepCheckPropertySheetMigration(self, sequence=None, **kw):
@@ -2413,19 +2404,11 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     Remove Property Sheet
     """
-    ps_title = sequence.get('ps_title', None)
     ps_path = sequence.get('ps_path', None)
-    self.assertTrue(ps_path is not None)
+    self.assertIsNotNone(ps_path)
     self.assertTrue(os.path.exists(ps_path))
     os.remove(ps_path)
     self.assertFalse(os.path.exists(ps_path))
-    return
-    # Property Sheet will not be installed in file sytem
-    self.assertFalse(os.path.exists(ps_path))
-    # Property Sheet will be installed in ZODB
-    self.assertTrue(getattr(self.portal.portal_property_sheets, ps_title, None) is not None)
-    self.portal.portal_property_sheets.manage_delObjects([ps_title])
-    self.assertFalse(getattr(self.portal.portal_property_sheets, ps_title, None) is not None)
 
   def stepRemovePropertySheetFromZODB(self, sequence=None, sequencer_list=None, **kw):
     """
@@ -2433,7 +2416,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     ps_title = sequence.get('ps_title', None)
     ps_path = sequence.get('ps_path', None)
-    self.assertTrue(ps_path is not None)
+    self.assertIsNotNone(ps_path)
     # Property Sheet will not be installed in file sytem
     self.assertFalse(os.path.exists(ps_path))
     # Property Sheet will be installed in ZODB
@@ -2447,7 +2430,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     ps_title = sequence.get('ps_title', None)
     ps_path = sequence.get('ps_path', None)
-    self.assertTrue(ps_path is not None)
+    self.assertIsNotNone(ps_path)
     # Property Sheet will not be installed in file sytem
     self.assertFalse(os.path.exists(ps_path))
     # Property Sheet will be installed in ZODB
@@ -2458,7 +2441,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     Check deletion of Property Sheet
     """
     ps_path = sequence.get('ps_path', None)
-    self.assertTrue(ps_path is not None)
+    self.assertIsNotNone(ps_path)
     self.assertFalse(os.path.exists(ps_path))
 
   def stepCheckMigratedPropertySheetRemoved(self, sequence=None, **kw):
@@ -2492,7 +2475,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     ps_title = sequence.get('ps_title', None)
     ps_path = sequence.get('ps_path', None)
-    self.assertTrue(ps_path is not None)
+    self.assertIsNotNone(ps_path)
     # Property Sheet will not be installed in file sytem
     self.assertFalse(os.path.exists(ps_path))
     # Property Sheet will be installed in ZODB
@@ -2696,7 +2679,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     for item_name in item_list:
       item = getattr(bt, item_name)
       if item is not None:
-        for key, data in item._objects.items():
+        for data in item._objects.itervalues():
           if hasattr(data, '__ac_local_roles__'):
             self.assertTrue(data.__ac_local_roles__ is None)
           if hasattr(data, '_owner'):
@@ -2796,7 +2779,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     self.assertTrue(p._getOb('portal_simulation', None) is None)
 
   def stepCheckSimulationToolExists(self, sequence=None, **kw):
-    self.assertTrue(self.getSimulationTool() is not None)
+    self.assertIsNotNone(self.getSimulationTool())
 
   def stepCheckSubobjectsNotIncluded(self, sequence=None, **kw):
     """Check subobjects are not included in the base category.
@@ -2806,30 +2789,19 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     # XXX maybe too low level
     base_category_obj = bt._category_item._objects.get(
         'portal_categories/%s' % base_category_id)
-    self.assertTrue(base_category_obj is not None)
+    self.assertIsNotNone(base_category_obj)
     self.assertEqual(len(base_category_obj.objectIds()), 0)
 
   def stepCheckNoMissingDependencies(self, sequence=None, **kw):
     """ Check if bt has no missing dependency
     """
-    missing_dep = False
-    bt = sequence.get('current_bt')
-    try:
-      bt.checkDependencies()
-    except:
-      missing_dep = True
-    self.assertTrue(not missing_dep)
+    sequence['current_bt'].checkDependencies()
 
   def stepCheckMissingDependencies(self, sequence=None, **kw):
     """ Check if bt has missing dependency
     """
-    missing_dep = False
-    bt = sequence.get('current_bt')
-    try:
-      bt.checkDependencies()
-    except:
-      missing_dep = True
-    self.assertTrue(missing_dep)
+    with self.assertRaises(Exception):
+      sequence['current_bt'].checkDependencies()
 
   def stepAddDependency(self, sequence=None, **kw):
     """ Add a dependency to the business template
@@ -2992,7 +2964,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     new_value = []
     workflow_chain_list = list(bt.getTemplatePortalTypeWorkflowChainList())
     for workflow_chain in workflow_chain_list:
-      portal_type, wkflow_id = workflow_chain.split(' | ')
+      _, wkflow_id = workflow_chain.split(' | ')
       if wkflow_id != workflow_id:
         new_value.append(workflow_chain)
     bt.edit(template_portal_type_workflow_chain_list=new_value)
@@ -3018,8 +2990,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
     """
     Add type role to business template
     """
-    bt = sequence.get('current_bt', None)
-    self.assertTrue(bt is not None)
+    bt = sequence['current_bt']
     ptype_ids = []
     ptype_ids.append(sequence.get('object_ptype_id', ''))
     ptype_ids.append(sequence.get('module_ptype_id', ''))
@@ -3069,7 +3040,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
   def stepCreateFakeZODBScript(self, sequence=None, **kw):
     """Create a Script inside portal_skins
     """
-    grain_of_sand = ''.join([random.choice(string.ascii_letters) for i in xrange(10)])
+    grain_of_sand = ''.join([random.choice(string.ascii_letters) for _ in xrange(10)])
     python_script_id = 'ERP5Site_dummyScriptWhichRandomId%s' % grain_of_sand
     skin_folder_id = 'custom'
     if getattr(self.portal.portal_skins, skin_folder_id, None) is None:
@@ -6765,7 +6736,7 @@ class TestBusinessTemplate(BusinessTemplateMixin):
     """
     # Simulate the case where we have an installed business template providing
     # the path test_document
-    new_object = self.portal.newContent(portal_type='File', id='test_document')
+    self.portal.newContent(portal_type='File', id='test_document')
 
     bt = self.portal.portal_templates.newContent(
         portal_type='Business Template',
@@ -7150,12 +7121,10 @@ class TestBusinessTemplate(BusinessTemplateMixin):
     bt.edit(template_registered_version_priority_selection_list=())
 
   def stepCheckVersionPrioritySetOnSite(self, sequence=None, **kw):
-    bt = sequence.get('current_bt')
     self.assertEqual(self.getPortalObject().getVersionPriorityList(),
                      sequence['expected_version_priority_list'])
 
   def stepCheckVersionPriorityRemovedFromSite(self, sequence=None, **kw):
-    bt = sequence.get('current_bt')
     self.assertEqual(self.getPortalObject().getVersionPriorityList(),
                      ('erp5 | 0.0',))
 
@@ -7341,8 +7310,7 @@ class TestBusinessTemplate(BusinessTemplateMixin):
 
     self.commit()
     self.portal.organisation_module.manage_delObjects(['1'])
-    broken = self.portal.organisation_module.newContent(
-                   portal_type='Mock Broken Organisation', id='1')
+    self.portal.organisation_module.newContent(portal_type='Mock Broken Organisation', id='1')
     self.commit()
     self.tic() # triger undex/index the document
 
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.xml
index f5bbeace7698ca2fa7dffae14b1f682e2cc5bda8..f4e7e22f27d7c938e481b0827e55153cf15d526b 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testBusinessTemplate.xml
@@ -49,51 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 68,  2: Arguments number differs from overridden \'_catch_log_errors\' method (arguments-differ)</string>
-                <string>W: 85,  2: Arguments number differs from overridden \'_ignore_log_errors\' method (arguments-differ)</string>
-                <string>W:135, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:427,  8: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:618,  6: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:606,  4: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:617,  8: Unused variable \'i\' (unused-variable)</string>
-                <string>W:642,  6: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:641,  8: Unused variable \'i\' (unused-variable)</string>
-                <string>W:696,  6: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:709,  6: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:1191,  8: Unused variable \'i\' (unused-variable)</string>
-                <string>W:1259,  8: Unused variable \'i\' (unused-variable)</string>
-                <string>W:1337, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1353, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1366, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1377, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1389, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1389, 14: Unused variable \'wf_ids\' (unused-variable)</string>
-                <string>W:1445, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:1477,  4: Redefining built-in \'bin\' (redefined-builtin)</string>
-                <string>W:1713,  4: Redefining built-in \'filter\' (redefined-builtin)</string>
-                <string>W:1730,  4: Redefining built-in \'filter\' (redefined-builtin)</string>
-                <string>W:1750,  6: Expression "catalog._getFilterDict()[method_id]" is assigned to nothing (expression-not-assigned)</string>
-                <string>W:1771,  6: Expression "catalog._getFilterDict()[method_id]" is assigned to nothing (expression-not-assigned)</string>
-                <string>W:2468,  4: Unreachable code (unreachable)</string>
-                <string>W:2743, 12: Unused variable \'key\' (unused-variable)</string>
-                <string>W:2863,  4: No exception type(s) specified (bare-except)</string>
-                <string>W:2874,  4: No exception type(s) specified (bare-except)</string>
-                <string>W:2968, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:2998, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:2998, 14: Unused variable \'wf_ids\' (unused-variable)</string>
-                <string>W:3013, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:3013, 14: Unused variable \'wf_ids\' (unused-variable)</string>
-                <string>W:3028, 10: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:3066,  6: Unused variable \'portal_type\' (unused-variable)</string>
-                <string>W:3143, 69: Unused variable \'i\' (unused-variable)</string>
-                <string>W:6460,  8: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:6855,  4: Unused variable \'new_object\' (unused-variable)</string>
-                <string>W:7169,  4: Unused variable \'bt\' (unused-variable)</string>
-                <string>W:7174,  4: Unused variable \'bt\' (unused-variable)</string>
-                <string>W:7360,  4: Unused variable \'broken\' (unused-variable)</string>
-                <string>W: 45,  0: Unused import gc (unused-import)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.py
index f0f9339769c5b379f6c72904d28a766f7cc7092f..ef001bb0be7943058ad23cd2bf3e1e467edac497 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.py
@@ -65,8 +65,7 @@ class TestRamCache(ERP5TypeTestCase):
     test_scopes.sort()
 
     ## remove DistributedRamCache since it's a flat storage
-    filtered_cache_plugins = filter(
-        lambda x: not isinstance(x, DistributedRamCache), self.cache_plugins)
+    filtered_cache_plugins = [x for x in self.cache_plugins if not isinstance(x, DistributedRamCache)]
 
     for cache_plugin in filtered_cache_plugins:
       if not self.quiet:
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.xml
index 064a4d4de1e8edc3fbed12d66e0b3afebca2a377..eb364599b40c67ef21d9d430f5c9df6e112a51dc 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCache.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testCache</string> </value>
@@ -43,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 68, 29: map/filter on lambda could be replaced by comprehension (deprecated-lambda)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -55,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -74,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -83,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.py
index 13f2944516ba1eb5b8043bcdd38b1fd8acfd1fbb..9f3ea4f7516c3b0f63442429d55717b4246a4b52 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.py
@@ -65,7 +65,7 @@ class TestCacheTool(ERP5TypeTestCase):
     self.createCachedMethod()
     self.commit()
 
-  def login(self):
+  def login(self): # pylint:disable=arguments-differ
     uf = self.portal.acl_users
     uf._doAddUser('admin', '', ['Manager'], [])
     uf._doAddUser('ERP5TypeTestCase', '', ['Manager'], [])
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.xml
index 7b4903a1b20b64c92f7db303dc6156b3e7179faa..a201ae4425e4b82554458ac0d8e4a81379f9bc31 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCacheTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testCacheTool</string> </value>
@@ -43,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 68,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -55,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -74,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -83,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.py
index ea67cc276344bbbc40e1e76e7068dee1ef2bc554..3bcb34b78183678f0daab0da651c8d4f0181e7eb 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.py
@@ -57,7 +57,7 @@ class TestCachedSkinsTool(ERP5TypeTestCase):
     # Use None as skinname to keep using the default one.
     self.getSkinnableObject().changeSkin(skinname=None)
 
-  def login(self):
+  def login(self): # pylint:disable=arguments-differ
     uf = self.portal.acl_users
     uf._doAddUser('vincent', '', ['Manager'], [])
     user = uf.getUserById('vincent').__of__(uf)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.xml
index 2428d05c812876396d6dfde5274a69348997e7a6..7a1341d590051104e4290969cc18f5a9c6682bfa 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCachedSkinsTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testCachedSkinsTool</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testCachedSkinsTool</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testCachedSkinsTool</string> </value>
@@ -37,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 60,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -49,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -68,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -77,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.py
index dcca11c01ab123504726f5c4de97ba90b3dad727..78cf2aa3b173e4ffeb88838f879295baab75ea6f 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.py
@@ -49,7 +49,7 @@ class TestConstraint(PropertySheetTestCase):
     """
     return ('erp5_base',)
 
-  def login(self):
+  def login(self):  # pylint:disable=arguments-differ
     uf = self.portal.acl_users
     uf._doAddUser('rc', '', ['Manager'], [])
     user = uf.getUserById('rc').__of__(uf)
@@ -114,26 +114,24 @@ class TestConstraint(PropertySheetTestCase):
       Create a object which will be tested.
     """
     module = self.portal.getDefaultModule(self.object_portal_type)
-    object = module.newContent(portal_type=self.object_portal_type)
-    group1 = object.portal_categories.restrictedTraverse('group/testGroup1')
+    document = module.newContent(portal_type=self.object_portal_type)
+    group1 = document.portal_categories.restrictedTraverse('group/testGroup1')
     if sequence:
       sequence.edit(
-          object=object,
+          document=document,
           group=group1,
       )
-    return object
+    return document
 
   def stepSetObjectGroup(self, sequence=None,
                          sequence_list=None, **kw):
     """
       Set a group to object
     """
-    object = sequence.get('object')
-#     group1 = object.portal_categories.restrictedTraverse('group/testGroup1')
-#     object.edit(group_value=group1)
-    object.edit(group='testGroup1')
+    document = sequence.get('document')
+    document.edit(group='testGroup1')
     self.assertNotEqual(
-          object.getGroup(portal_type=()),
+          document.getGroup(portal_type=()),
           None )
 
   def stepSetObjectGroupOrganisation(self, sequence=None,
@@ -141,11 +139,11 @@ class TestConstraint(PropertySheetTestCase):
     """
       Set a group to object, forcing portal_type color to Organisation
     """
-    object = sequence.get('object')
-    object.setGroup(object.getRelativeUrl(),
+    document = sequence.get('document')
+    document.setGroup(document.getRelativeUrl(),
                     portal_type='Organisation')
     self.assertNotEqual(
-          object.getGroup(portal_type='Organisation'),
+          document.getGroup(portal_type='Organisation'),
           None )
 
   def stepSetObjectGroupList(self, sequence=None,
@@ -153,68 +151,65 @@ class TestConstraint(PropertySheetTestCase):
     """
       Set a group to object
     """
-    object = sequence.get('object')
-#     group1 = object.portal_categories.restrictedTraverse('group/testGroup1')
-#     group2 = object.portal_categories.restrictedTraverse('group/testGroup2')
-#     object.edit(group_value_list=[group1, group2])
-    object.edit(group_list=['testGroup1', 'testGroup2'])
+    document = sequence.get('document')
+    document.edit(group_list=['testGroup1', 'testGroup2'])
 
   def stepSetObjectTitle(self, sequence=None,
                          sequence_list=None, **kw):
     """
       Set a different title value
     """
-    object = sequence.get('object')
+    document = sequence.get('document')
     object_title = self.object_title
-    object.setTitle(object_title)
+    document.setTitle(object_title)
 
   def stepSetObjectNoneTitle(self, sequence=None,
                              sequence_list=None, **kw):
     """
       Set a different title value
     """
-    object = sequence.get('object')
+    document = sequence.get('document')
     # Do not call edit, as we want to explicitely modify the property
     # (and edit modify only if value is different)
-    object.setTitle(None)
+    document.setTitle(None)
 
   def stepSetObjectEmptyTitle(self, sequence=None,
                               sequence_list=None, **kw):
     """
       Set a different title value
     """
-    object = sequence.get('object')
+    document = sequence.get('document')
     # Do not call edit, as we want to explicitely modify the property
     # (and edit modify only if value is different)
-    object.setTitle('')
+    document.setTitle('')
 
   def stepSetObjectIntTitle(self, sequence=None,
                             sequence_list=None, **kw):
     """
       Set a different title value
     """
-    object = sequence.get('object')
-    object.edit(title=12345)
+    document = sequence.get('document')
+    document.edit(title=12345)
 
   def stepSetObjectBadTypedProperty(self, sequence=None,
                             sequence_list=None, **kw):
     """
       Set a property with a bad type
     """
-    object = sequence.get('object')
+    document = sequence.get('document')
     property_name = 'ean13code'
-    # make sure the property is defined on the object
-    self.assertTrue(not object.hasProperty(property_name))
-    self.assertTrue(object.getPropertyType(property_name) != 'int')
-    object.setProperty(property_name, 12)
+    # make sure the property is defined on the document
+    self.assertTrue(not document.hasProperty(property_name))
+    self.assertTrue(document.getPropertyType(property_name) != 'int')
+    document.setProperty(property_name, 12)
 
   def stepSetObjectIntLocalProperty(self, sequence=None,
                             sequence_list=None, **kw):
     """
-      Set a local property on the object, with an int type.
+      Set a local property on the document, with an int type.
     """
-    object = sequence.get('object')
-    object.edit(local_prop = 12345)
+    document = sequence.get('document')
+    document.edit(local_prop = 12345)
 
   def _createGenericConstraint(self, sequence=None, klass_name='Constraint',
                                **kw):
@@ -225,9 +220,7 @@ class TestConstraint(PropertySheetTestCase):
     module = Constraint
     file_path = "%s.%s" % (module.__name__, klass_name)
     __import__(file_path)
-    file = getattr(module, klass_name)
-    klass = file
-#     klass = getattr(file, klass_name)
+    klass = getattr(module, klass_name)
     constraint = klass(**kw)
     if sequence is not None:
       sequence.edit(constraint=constraint,)
@@ -238,10 +231,10 @@ class TestConstraint(PropertySheetTestCase):
     """
       Call checkConsistency of a Constraint.
     """
-    object = sequence.get('object')
+    document = sequence.get('document')
     constraint = sequence.get('constraint')
     # Check
-    error_list = constraint.checkConsistency(object)
+    error_list = constraint.checkConsistency(document)
     sequence.edit(
         error_list=error_list
     )
@@ -251,10 +244,10 @@ class TestConstraint(PropertySheetTestCase):
     """
       Call checkConsistency of a Constraint, fixing the errors.
     """
-    object = sequence.get('object')
+    document = sequence.get('document')
     constraint = sequence.get('constraint')
     # Check
-    error_list = constraint.checkConsistency(object, fixit=1)
+    error_list = constraint.checkConsistency(document, fixit=1)
     sequence.edit(
         error_list=error_list
     )
@@ -264,10 +257,10 @@ class TestConstraint(PropertySheetTestCase):
     """
     Call checkConsistency of a Constraint.
     """
-    object = sequence.get('group')
+    document = sequence.get('group')
     constraint = sequence.get('constraint')
     # Check
-    error_list = constraint.checkConsistency(object)
+    error_list = constraint.checkConsistency(document)
     sequence.edit(
         error_list=error_list
     )
@@ -1327,8 +1320,8 @@ class TestConstraint(PropertySheetTestCase):
     """
       Create a Content Object inside one Object
     """
-    object = sequence.get('object')
-    content_object = object.newContent(portal_type=self.object_content_portal_type)
+    document = sequence.get('document')
+    content_object = document.newContent(portal_type=self.object_content_portal_type)
     sequence.edit(
         content_object = content_object,
     )
@@ -1373,20 +1366,20 @@ class TestConstraint(PropertySheetTestCase):
     """
       Set valid Title to Object
     """
-    object = sequence.get('object')
-    object.setTitle(self.object_title)
+    document = sequence.get('document')
+    document.setTitle(self.object_title)
     sequence.edit(
-        object = object,
+        document = document,
     )
 
   def stepSetObjectTitle1(self, sequence=None, sequence_list=None, **kw):
     """
       Set empty (or invalid string) to Object
     """
-    object = sequence.get('object')
-    object.setTitle(' ')
+    document = sequence.get('document')
+    document.setTitle(' ')
     sequence.edit(
-        object = object,
+        document = document,
     )
 
   def test_StringAttributeMatchConstraint(self):
@@ -1527,13 +1520,13 @@ class TestConstraint(PropertySheetTestCase):
   def stepValidateObject(self, sequence=None, sequence_list=None, **kw):
     """
     """
-    document = sequence.get('object')
+    document = sequence.get('document')
     document.validate()
 
   def stepInvalidateObject(self, sequence=None, sequence_list=None, **kw):
     """
     """
-    document = sequence.get('object')
+    document = sequence.get('document')
     document.invalidate()
 
   def stepCreateAttributeUnicityConstraint(self, sequence=None,
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.xml
index 590159c0330316c2eca267e18fff61e56cfc34ea..96de3609cb3044676d3665557f9db4605095dee7 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testConstraint.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testConstraint</string> </value>
@@ -43,26 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 52,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-                <string>W:117,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:131,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:144,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:156,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:167,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:176,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:186,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:196,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:204,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:216,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:228,  4: Redefining built-in \'file\' (redefined-builtin)</string>
-                <string>W:241,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:254,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:267,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:1330,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:1376,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-                <string>W:1386,  4: Redefining built-in \'object\' (redefined-builtin)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -72,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -91,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -100,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py
index 64136e45a1551c12b8ed4cf61cfca59d1099ee74..9b3b4c371f48e450574ec9fe04afcb2bc1466689 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py
@@ -28,7 +28,7 @@
 
 import unittest
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-from AccessControl.SecurityManagement import newSecurityManager
+
 
 class TestERP5Category(ERP5TypeTestCase):
 
@@ -64,7 +64,6 @@ class TestERP5Category(ERP5TypeTestCase):
     return self.getSalePackingListModule()['1']
 
   def afterSetUp(self):
-    self.login()
     # This add the base category size
     portal_categories = self.getCategoryTool()
     person_module = self.getPersonModule()
@@ -155,12 +154,6 @@ class TestERP5Category(ERP5TypeTestCase):
 
     self.commitAndTic()
 
-  def login(self):
-    uf = self.getPortal().acl_users
-    uf._doAddUser('seb', '', ['Manager'], [])
-    user = uf.getUserById('seb').__of__(uf)
-    newSecurityManager(None, user)
-
   def commitAndTic(self):
     """Just to save one line.
     """
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.xml
index 2f9810f482e0aa0bf2d8eef6d7c6facdb8b3fbed..0ae17651a3ce8dd2e3d6342d267c21cdbfe561c4 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testERP5Category</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testERP5Category</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testERP5Category</string> </value>
@@ -37,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W:158,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -49,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -68,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -77,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.py
index edead29acb8bdb464ef6c22620495acfdb36a648..d81dc0de60a29a59111d79ad24510726f541b3d4 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.py
@@ -65,7 +65,7 @@ if 1: # BBB
                                                   *args, **kw)
 
   def setGlobalTranslationService(translation_service):
-    global global_translation_service
+    global global_translation_service   # pylint:disable=global-statement
     global_translation_service = translation_service
     zope.component.provideUtility(DummyTranslationDomainFallback,
                                   provides=IFallbackTranslationDomainFactory)
@@ -578,9 +578,8 @@ class TestERP5Core(ERP5TypeTestCase, ZopeTestCase.Functional):
          0 != i.getUid() != i.getProperty('uid')])
 
   def test_04_site_manager_and_translation_migration(self):
-    from zope.site.hooks import getSite, setSite
+    from zope.site.hooks import setSite
     from zope.component import queryUtility
-    from zope.i18n.interfaces import ITranslationDomain
     # check translation is working normaly
     erp5_ui_catalog = self.portal.Localizer.erp5_ui
     self.assertEqual(queryUtility(ITranslationDomain, 'erp5_ui'),
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.xml
index a7ca02df76c2c5552520496c7e4fcdfc207ca3f0..427bc219cacc332ea5696945020b4f16153fa9ef 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Core.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testERP5Core</string> </value>
@@ -43,10 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 67,  4: Using the global statement (global-statement)</string>
-                <string>W:578,  4: Redefining name \'ITranslationDomain\' from outer scope (line 53) (redefined-outer-name)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -56,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -75,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -84,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.py
index 781b7acd57c1a36af775d98b40fa42a24740c36b..4b7dfe90641ce6dd207ce57f593be4a990eede53 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.py
@@ -99,8 +99,6 @@ class TestERP5Workflow(ERP5TypeTestCase):
     transition2.setReference('transition2')
     state1.setDestinationValueList([transition1, transition2])
 
-    self.portal.portal_types.Folder.setTypeWorkflowList(['wf'])
-    doc = self.portal.newContent(portal_type='Folder', id='test_doc')
     self.assertEqual([transition1, transition2], state1.getDestinationValueList())
 
 
@@ -231,6 +229,7 @@ class TestERP5Workflow(ERP5TypeTestCase):
     """
     workflow = self.workflow_module.newContent(portal_type='Workflow')
     state = workflow.newContent(portal_type='Workflow State', title='Some State')
+    state.Base_viewDict()
     transition = workflow.newContent(portal_type='Workflow Transition',
                                      title='Some Transition')
     transition.setReference('change_something')
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.xml
index 45ceb964ac3db33fb90b1a96a6d0380baacbe8f0..520de6c85ca58492eff16d2db44efa597258f236 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Workflow.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testERP5Workflow</string> </value>
@@ -53,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -72,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -81,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.py
index 46e41591d0a19edaa3bc50cb73ad884a993e08d0..71313c7362b66fac4f9462560a99050c5914a5cc 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.py
@@ -40,261 +40,261 @@ from zExceptions import Unauthorized
 
 class TestFolder(ERP5TypeTestCase, LogInterceptor):
 
-    # Some helper methods
+  # Some helper methods
 
-    def getTitle(self):
-      return "Folder"
+  def getTitle(self):
+    return "Folder"
 
-    def getBusinessTemplateList(self):
-      """
-        Return the list of business templates.
-      """
-      return tuple()
+  def getBusinessTemplateList(self):
+    """
+      Return the list of business templates.
+    """
+    return tuple()
 
-    def afterSetUp(self):
-      """
-        Executed before each test_*.
-      """
-      self.login()
-      self.folder = self.portal.newContent(id='TestFolder',
-                                                portal_type='Folder')
-      self.other_folder = self.portal.newContent(
-                    id='OtherTestFolder', portal_type='Folder')
+  def afterSetUp(self):
+    """
+      Executed before each test_*.
+    """
+    self.login()
+    self.folder = self.portal.newContent(id='TestFolder',
+                                              portal_type='Folder')
+    self.other_folder = self.portal.newContent(
+                  id='OtherTestFolder', portal_type='Folder')
 
-    def beforeTearDown(self):
-      """
-        Executed after each test_*.
-      """
-      self.portal.manage_delObjects(ids=[self.folder.getId(),
-                                          self.other_folder.getId()])
-      clearCache()
-      self.commit()
+  def beforeTearDown(self):
+    """
+      Executed after each test_*.
+    """
+    self.portal.manage_delObjects(ids=[self.folder.getId(),
+                                        self.other_folder.getId()])
+    clearCache()
+    self.commit()
 
-    def newContent(self):
-      """
-        Create an object in self.folder and return it.
-      """
-      return self.folder.newContent(portal_type='Folder')
+  def newContent(self):
+    """
+      Create an object in self.folder and return it.
+    """
+    return self.folder.newContent(portal_type='Folder')
 
-    def test_01_folderType(self):
-      """
-        Test if the present Folder class is the ERP5 version of Folder, not
-        CMF's.
-      """
-      self.assertTrue(isinstance(self.getTypesTool()['Folder'],
-                      ERP5TypeInformation))
+  def test_01_folderType(self):
+    """
+      Test if the present Folder class is the ERP5 version of Folder, not
+      CMF's.
+    """
+    self.assertTrue(isinstance(self.getTypesTool()['Folder'],
+                    ERP5TypeInformation))
 
-    def test_02_defaultGenerateNewId(self):
-      """
-        Test the default Id generation method.
-        Ids are incremented at content creation and start at 1.
-      """
-      # No id generator defined
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj = self.newContent()
-      self.assertEqual(obj.getId(), '1')
-      obj = self.newContent()
-      self.assertEqual(obj.getId(), '2')
+  def test_02_defaultGenerateNewId(self):
+    """
+      Test the default Id generation method.
+      Ids are incremented at content creation and start at 1.
+    """
+    # No id generator defined
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj = self.newContent()
+    self.assertEqual(obj.getId(), '1')
+    obj = self.newContent()
+    self.assertEqual(obj.getId(), '2')
 
-    def test_03_customGenerateNewId(self):
-      """
-        Test that id_generator property is honored.
-      """
-      id_generator_script_name = 'testIdGenerator'
-      id_generator_id_list = ['first_id', 'second_id']
-      createZODBPythonScript(self.portal.portal_skins.erp5_core,
-               id_generator_script_name, '',
-               'return %s[len(context)]' % (repr(id_generator_id_list), ))
-      self.folder.setIdGenerator(id_generator_script_name)
-      self.assertEqual(self.folder.getIdGenerator(), id_generator_script_name)
-      for expected_length in xrange(len(id_generator_id_list)):
-        self.assertEqual(len(self.folder), expected_length)
-        obj = self.newContent()
-        self.assertEqual(obj.getId(), id_generator_id_list[expected_length])
+  def test_03_customGenerateNewId(self):
+    """
+      Test that id_generator property is honored.
+    """
+    id_generator_script_name = 'testIdGenerator'
+    id_generator_id_list = ['first_id', 'second_id']
+    createZODBPythonScript(self.portal.portal_skins.erp5_core,
+              id_generator_script_name, '',
+              'return %s[len(context)]' % (repr(id_generator_id_list), ))
+    self.folder.setIdGenerator(id_generator_script_name)
+    self.assertEqual(self.folder.getIdGenerator(), id_generator_script_name)
+    for expected_length in xrange(len(id_generator_id_list)):
+      self.assertEqual(len(self.folder), expected_length)
+      obj = self.newContent()
+      self.assertEqual(obj.getId(), id_generator_id_list[expected_length])
 
-    def test_03_unkownGenerateNewId(self):
-      self.folder.setIdGenerator('no such method')
-      self.assertRaises(ValueError, self.folder.generateNewId)
-      self.assertRaises(ValueError, self.folder.newContent)
+  def test_03_unkownGenerateNewId(self):
+    self.folder.setIdGenerator('no such method')
+    self.assertRaises(ValueError, self.folder.generateNewId)
+    self.assertRaises(ValueError, self.folder.newContent)
 
-    def _setAllowedContentTypesForFolderType(self, allowed_content_type_list):
-      """Set allowed content types for Folder portal type."""
-      self.getTypesTool().Folder.edit(
-        type_allowed_content_type_list=allowed_content_type_list,
-        type_filter_content_type=True)
+  def _setAllowedContentTypesForFolderType(self, allowed_content_type_list):
+    """Set allowed content types for Folder portal type."""
+    self.getTypesTool().Folder.edit(
+      type_allowed_content_type_list=allowed_content_type_list,
+      type_filter_content_type=True)
 
-    def _assertAllowedContentTypes(self, obj, expected_allowed_content_types):
-      """Asserts that allowed content types for obj are exactly what we
-      have in expected_allowed_content_types."""
-      self.assertEqual(sorted(expected_allowed_content_types),
-                       sorted(x.getId() for x in obj.allowedContentTypes()))
+  def _assertAllowedContentTypes(self, obj, expected_allowed_content_types):
+    """Asserts that allowed content types for obj are exactly what we
+    have in expected_allowed_content_types."""
+    self.assertEqual(sorted(expected_allowed_content_types),
+                      sorted(x.getId() for x in obj.allowedContentTypes()))
 
-    def test_AllowedContentTypes(self):
-      type_list = ['Folder', 'Category', 'Base Category']
-      self._setAllowedContentTypesForFolderType(type_list)
-      self._assertAllowedContentTypes(self.folder, type_list)
+  def test_AllowedContentTypes(self):
+    type_list = ['Folder', 'Category', 'Base Category']
+    self._setAllowedContentTypesForFolderType(type_list)
+    self._assertAllowedContentTypes(self.folder, type_list)
 
-    def test_AllowedContentTypesCacheExpiration(self):
-      type_list = ['Folder', 'Category', 'Base Category']
-      self._setAllowedContentTypesForFolderType(type_list)
-      self.folder.manage_permission(
-                    'Add portal content', roles=[], acquire=0)
-      self._assertAllowedContentTypes(self.folder, [])
-      self.folder.manage_permission(
-                    'Add portal content', roles=['Manager'], acquire=0)
-      self._assertAllowedContentTypes(self.folder, type_list)
+  def test_AllowedContentTypesCacheExpiration(self):
+    type_list = ['Folder', 'Category', 'Base Category']
+    self._setAllowedContentTypesForFolderType(type_list)
+    self.folder.manage_permission(
+                  'Add portal content', roles=[], acquire=0)
+    self._assertAllowedContentTypes(self.folder, [])
+    self.folder.manage_permission(
+                  'Add portal content', roles=['Manager'], acquire=0)
+    self._assertAllowedContentTypes(self.folder, type_list)
 
-    def test_AllowedContentTypesObjectIndependance(self):
-      type_list = ['Folder', 'Category', 'Base Category']
-      self._setAllowedContentTypesForFolderType(type_list)
-      self._assertAllowedContentTypes(self.folder, type_list)
-      self.other_folder.manage_permission(
-                    'Add portal content', roles=[], acquire=0)
-      self._assertAllowedContentTypes(self.other_folder, [])
-      self._assertAllowedContentTypes(self.folder, type_list)
+  def test_AllowedContentTypesObjectIndependance(self):
+    type_list = ['Folder', 'Category', 'Base Category']
+    self._setAllowedContentTypesForFolderType(type_list)
+    self._assertAllowedContentTypes(self.folder, type_list)
+    self.other_folder.manage_permission(
+                  'Add portal content', roles=[], acquire=0)
+    self._assertAllowedContentTypes(self.other_folder, [])
+    self._assertAllowedContentTypes(self.folder, type_list)
 
-    def test_NewContentAndAllowedContentTypes(self):
-      self._setAllowedContentTypesForFolderType(('Folder', ))
-      self.assertRaises(ValueError, self.folder.newContent,
-                        portal_type='Category')
+  def test_NewContentAndAllowedContentTypes(self):
+    self._setAllowedContentTypesForFolderType(('Folder', ))
+    self.assertRaises(ValueError, self.folder.newContent,
+                      portal_type='Category')
 
-    def test_editWithoutModifyPortalContent(self):
-      edit = guarded_getattr(self.folder, 'edit')
-      original_permission_list = self.folder.permission_settings('Modify portal content')
-      assert len(original_permission_list) == 1
-      self.folder.manage_permission('Modify portal content', [], 0)
-      self.assertRaises(Unauthorized, guarded_getattr, self.folder, 'edit')
-      # Reset to original permissions
-      self.folder.manage_permission('Modify portal content', original_permission_list[0]['roles'], original_permission_list[0]['acquire'])
+  def test_editWithoutModifyPortalContent(self):
+    _ = guarded_getattr(self.folder, 'edit')
+    original_permission_list = self.folder.permission_settings('Modify portal content')
+    assert len(original_permission_list) == 1
+    self.folder.manage_permission('Modify portal content', [], 0)
+    self.assertRaises(Unauthorized, guarded_getattr, self.folder, 'edit')
+    # Reset to original permissions
+    self.folder.manage_permission('Modify portal content', original_permission_list[0]['roles'], original_permission_list[0]['acquire'])
 
-    def _createUpgradeObjectClassPythonScript(self):
-      """Create a simple python script """
-      createZODBPythonScript(self.portal.portal_skins.custom,
-                     "test_upgradeObject", 'x',
-                     'return [1]')
-      return self.portal.portal_skins.custom.test_upgradeObject
+  def _createUpgradeObjectClassPythonScript(self):
+    """Create a simple python script """
+    createZODBPythonScript(self.portal.portal_skins.custom,
+                    "test_upgradeObject", 'x',
+                    'return [1]')
+    return self.portal.portal_skins.custom.test_upgradeObject
 
 
-    def test_upgradeObjectClass(self):
-      """ Test if it changes Object Class """
-      type_list = ['Folder', 'Category' ]
-      self._setAllowedContentTypesForFolderType(type_list)
-      obj = self.folder.newContent(portal_type="Category")
-      from_class = obj.__class__
-      to_class = self.folder.__class__
-      test_script = self._createUpgradeObjectClassPythonScript()
-      result = self.folder.upgradeObjectClass(test_script, from_class,
-                                              to_class, test_script)
-      self.commit()
-      self.assertEqual(self.folder[obj.getId()].__class__, to_class)
-      self.assertNotEquals(self.folder[obj.getId()].__class__, from_class)
-      self.assertEqual([1], result)
+  def test_upgradeObjectClass(self):
+    """ Test if it changes Object Class """
+    type_list = ['Folder', 'Category' ]
+    self._setAllowedContentTypesForFolderType(type_list)
+    obj = self.folder.newContent(portal_type="Category")
+    from_class = obj.__class__
+    to_class = self.folder.__class__
+    test_script = self._createUpgradeObjectClassPythonScript()
+    result = self.folder.upgradeObjectClass(test_script, from_class,
+                                            to_class, test_script)
+    self.commit()
+    self.assertEqual(self.folder[obj.getId()].__class__, to_class)
+    self.assertNotEquals(self.folder[obj.getId()].__class__, from_class)
+    self.assertEqual([1], result)
 
-    def test_upgradeObjectClassOnlyTest(self):
-      """ Test if it DOES NOT change Object Class, only test it. """
-      type_list = ['Folder', 'Category' ]
-      self._setAllowedContentTypesForFolderType(type_list)
-      obj = self.folder.newContent(portal_type="Category")
-      from_class = obj.__class__
-      to_class = self.folder.__class__
-      test_script = self._createUpgradeObjectClassPythonScript()
-      result = self.folder.upgradeObjectClass(test_script, from_class,
-                                       to_class, test_script, test_only=1)
-      self.commit()
-      self.assertNotEquals(self.folder[obj.getId()].__class__, to_class)
-      self.assertEqual(self.folder[obj.getId()].__class__, from_class)
-      self.assertEqual([1], result)
+  def test_upgradeObjectClassOnlyTest(self):
+    """ Test if it DOES NOT change Object Class, only test it. """
+    type_list = ['Folder', 'Category' ]
+    self._setAllowedContentTypesForFolderType(type_list)
+    obj = self.folder.newContent(portal_type="Category")
+    from_class = obj.__class__
+    to_class = self.folder.__class__
+    test_script = self._createUpgradeObjectClassPythonScript()
+    result = self.folder.upgradeObjectClass(test_script, from_class,
+                                      to_class, test_script, test_only=1)
+    self.commit()
+    self.assertNotEquals(self.folder[obj.getId()].__class__, to_class)
+    self.assertEqual(self.folder[obj.getId()].__class__, from_class)
+    self.assertEqual([1], result)
 
-    def test_upgradeObjectClassHierarchicaly(self):
-      """ Test if migrate sub objects Hierarchicaly """
-      type_list = ['Folder', 'Category', 'Base Category']
-      self._setAllowedContentTypesForFolderType(type_list)
-      subfolder = self.newContent()
-      obj = subfolder.newContent(portal_type="Category")
-      from_class = obj.__class__
-      to_class = self.folder.__class__
-      test_script = self._createUpgradeObjectClassPythonScript()
-      result = self.folder.upgradeObjectClass(test_script, from_class,
-                                              to_class, test_script)
-      self.commit()
-      self.assertEqual(subfolder[obj.getId()].__class__, to_class)
-      self.assertNotEquals(subfolder[obj.getId()].__class__, from_class)
-      self.assertEqual([1], result)
+  def test_upgradeObjectClassHierarchicaly(self):
+    """ Test if migrate sub objects Hierarchicaly """
+    type_list = ['Folder', 'Category', 'Base Category']
+    self._setAllowedContentTypesForFolderType(type_list)
+    subfolder = self.newContent()
+    obj = subfolder.newContent(portal_type="Category")
+    from_class = obj.__class__
+    to_class = self.folder.__class__
+    test_script = self._createUpgradeObjectClassPythonScript()
+    result = self.folder.upgradeObjectClass(test_script, from_class,
+                                            to_class, test_script)
+    self.commit()
+    self.assertEqual(subfolder[obj.getId()].__class__, to_class)
+    self.assertNotEquals(subfolder[obj.getId()].__class__, from_class)
+    self.assertEqual([1], result)
 
-    def test_upgradeObjectClassWithSubObject(self):
-      """ Test If upgrade preseve subobjects """
-      type_list = ['Folder', 'Category', 'Base Category']
-      self._setAllowedContentTypesForFolderType(type_list)
-      subobject = self.folder.newContent(portal_type="Category")
-      obj = subobject.newContent(portal_type="Category")
-      from_class = obj.__class__
-      to_class = self.folder.__class__
-      test_script = self._createUpgradeObjectClassPythonScript()
-      result = self.folder.upgradeObjectClass(test_script, from_class,
-                                              to_class, test_script)
-      self.commit()
-      self.assertEqual(self.folder[subobject.getId()].__class__, to_class)
-      self.assertNotEquals(self.folder[subobject.getId()].__class__, from_class)
-      self.assertEqual(self.folder[subobject.getId()][obj.getId()].__class__, to_class)
-      self.assertNotEquals(self.folder[subobject.getId()][obj.getId()].__class__, from_class)
-      self.assertEqual([1, 1], result)
+  def test_upgradeObjectClassWithSubObject(self):
+    """ Test If upgrade preseve subobjects """
+    type_list = ['Folder', 'Category', 'Base Category']
+    self._setAllowedContentTypesForFolderType(type_list)
+    subobject = self.folder.newContent(portal_type="Category")
+    obj = subobject.newContent(portal_type="Category")
+    from_class = obj.__class__
+    to_class = self.folder.__class__
+    test_script = self._createUpgradeObjectClassPythonScript()
+    result = self.folder.upgradeObjectClass(test_script, from_class,
+                                            to_class, test_script)
+    self.commit()
+    self.assertEqual(self.folder[subobject.getId()].__class__, to_class)
+    self.assertNotEquals(self.folder[subobject.getId()].__class__, from_class)
+    self.assertEqual(self.folder[subobject.getId()][obj.getId()].__class__, to_class)
+    self.assertNotEquals(self.folder[subobject.getId()][obj.getId()].__class__, from_class)
+    self.assertEqual([1, 1], result)
 
-    def test_upgradeObjectClassWithStrings(self):
-      """ Test if it changes Object Class """
-      type_list = ['Folder', 'Category' ]
-      self._setAllowedContentTypesForFolderType(type_list)
-      obj = self.folder.newContent(portal_type="Category")
-      from_class_as_string = 'erp5.portal_type.Category'
-      to_class_as_string = 'erp5.portal_type.Folder'
-      from_class = obj.__class__
-      to_class = self.folder.__class__
-      test_script = self._createUpgradeObjectClassPythonScript()
-      result = self.folder.upgradeObjectClass(test_script, from_class_as_string,
-                                              to_class_as_string, test_script)
-      self.commit()
-      self.assertEqual(self.folder[obj.getId()].__class__, to_class)
-      self.assertNotEquals(self.folder[obj.getId()].__class__, from_class)
-      self.assertEqual([1], result)
+  def test_upgradeObjectClassWithStrings(self):
+    """ Test if it changes Object Class """
+    type_list = ['Folder', 'Category' ]
+    self._setAllowedContentTypesForFolderType(type_list)
+    obj = self.folder.newContent(portal_type="Category")
+    from_class_as_string = 'erp5.portal_type.Category'
+    to_class_as_string = 'erp5.portal_type.Folder'
+    from_class = obj.__class__
+    to_class = self.folder.__class__
+    test_script = self._createUpgradeObjectClassPythonScript()
+    result = self.folder.upgradeObjectClass(test_script, from_class_as_string,
+                                            to_class_as_string, test_script)
+    self.commit()
+    self.assertEqual(self.folder[obj.getId()].__class__, to_class)
+    self.assertNotEquals(self.folder[obj.getId()].__class__, from_class)
+    self.assertEqual([1], result)
 
-    def test_FolderMixinSecurity(self):
-      """ Test if FolderMix methods cannot be called by URL """
-      type_list = ['Folder']
-      self._setAllowedContentTypesForFolderType(type_list)
-      obj = self.folder.newContent(portal_type='Folder')
-      self.commit()
-      response = self.publish('%s/deleteContent?id=%s' % (
-              self.folder.absolute_url(relative=True), obj.getId()))
-      self.assertTrue(obj.getId() in self.folder.objectIds())
-      self.assertEqual(302, response.getStatus())
+  def test_FolderMixinSecurity(self):
+    """ Test if FolderMix methods cannot be called by URL """
+    type_list = ['Folder']
+    self._setAllowedContentTypesForFolderType(type_list)
+    obj = self.folder.newContent(portal_type='Folder')
+    self.commit()
+    response = self.publish('%s/deleteContent?id=%s' % (
+            self.folder.absolute_url(relative=True), obj.getId()))
+    self.assertTrue(obj.getId() in self.folder.objectIds())
+    self.assertEqual(302, response.getStatus())
 
-    def test_fragmentedLength(self):
-      """Test Folder._count type and behaviour"""
-      type_list = ['Folder']
-      self._setAllowedContentTypesForFolderType(type_list)
-      folder = self.folder
-      folder_dict = folder.__dict__
-      folder.newContent(portal_type='Folder')
-      self.assertEqual(len(folder), 1)
-      self.assertIsInstance(folder_dict['_count'], Length)
-      original_length_oid = folder_dict['_count']._p_oid
-      for _ in xrange(FRAGMENTED_LENGTH_THRESHOLD - len(folder) - 1):
-        folder.newContent(portal_type='Folder')
-      self.assertEqual(len(folder), FRAGMENTED_LENGTH_THRESHOLD - 1)
-      self.assertIsInstance(folder_dict['_count'], Length)
-      # Generate 3 to completely clear the threshold, as we do not care whether
-      # the change happens when reaching the threshold or when going over it.
-      folder.newContent(portal_type='Folder')
-      folder.newContent(portal_type='Folder')
+  def test_fragmentedLength(self):
+    """Test Folder._count type and behaviour"""
+    type_list = ['Folder']
+    self._setAllowedContentTypesForFolderType(type_list)
+    folder = self.folder
+    folder_dict = folder.__dict__
+    folder.newContent(portal_type='Folder')
+    self.assertEqual(len(folder), 1)
+    self.assertIsInstance(folder_dict['_count'], Length)
+    original_length_oid = folder_dict['_count']._p_oid
+    for _ in xrange(FRAGMENTED_LENGTH_THRESHOLD - len(folder) - 1):
       folder.newContent(portal_type='Folder')
-      self.assertEqual(len(folder), FRAGMENTED_LENGTH_THRESHOLD + 2)
-      fragmented_length = folder_dict['_count']
-      self.assertIsInstance(fragmented_length, FragmentedLength)
-      self.assertEqual(len(fragmented_length._map), 2, fragmented_length._map)
-      original_length = fragmented_length._map[None]
-      self.assertEqual(original_length_oid, original_length._p_oid)
-      self.assertGreater(original_length(), FRAGMENTED_LENGTH_THRESHOLD - 1)
-      self.assertGreater(len(folder), original_length())
+    self.assertEqual(len(folder), FRAGMENTED_LENGTH_THRESHOLD - 1)
+    self.assertIsInstance(folder_dict['_count'], Length)
+    # Generate 3 to completely clear the threshold, as we do not care whether
+    # the change happens when reaching the threshold or when going over it.
+    folder.newContent(portal_type='Folder')
+    folder.newContent(portal_type='Folder')
+    folder.newContent(portal_type='Folder')
+    self.assertEqual(len(folder), FRAGMENTED_LENGTH_THRESHOLD + 2)
+    fragmented_length = folder_dict['_count']
+    self.assertIsInstance(fragmented_length, FragmentedLength)
+    self.assertEqual(len(fragmented_length._map), 2, fragmented_length._map)
+    original_length = fragmented_length._map[None]
+    self.assertEqual(original_length_oid, original_length._p_oid)
+    self.assertGreater(original_length(), FRAGMENTED_LENGTH_THRESHOLD - 1)
+    self.assertGreater(len(folder), original_length())
 
 def test_suite():
   suite = unittest.TestSuite()
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.xml
index 8f449380d187def3c95b2ba8671d9c9c83badc47..d662ccbbd6a8510381d7696360dcc58ff24ef1be 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolder.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testFolder</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testFolder</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testFolder</string> </value>
@@ -37,196 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 45,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 46,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 48,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 49,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 52,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 54,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 55,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 58,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 59,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 61,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 64,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 65,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 68,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 70,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 71,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 73,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 74,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 77,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 79,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 80,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 84,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 87,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 88,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 93,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 94,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 95,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 96,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 97,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 98,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:100,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:101,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:104,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:105,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:106,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:109,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:110,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:111,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:112,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W:113,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W:114,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W:116,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:117,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:118,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:119,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:121,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:122,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:123,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:127,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:128,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:130,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:133,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:134,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:135,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:136,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:138,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:139,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:140,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:141,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:143,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:144,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:146,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:148,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:149,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:150,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:151,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:152,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:154,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:155,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:157,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:158,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:159,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:162,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:163,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:164,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:165,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:166,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:167,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:169,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:171,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:172,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:173,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:176,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:179,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:180,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:181,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:182,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:183,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:184,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:185,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:186,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:187,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:189,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:190,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:191,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:192,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:194,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:195,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:196,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:197,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:198,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:199,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:200,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:201,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:202,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:204,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:205,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:206,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:207,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:209,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:210,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:211,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:212,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:213,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:214,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:215,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:216,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:217,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:218,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:220,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:221,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:222,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:223,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:225,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:226,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:227,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:228,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:229,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:230,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:231,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:232,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:233,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:234,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:236,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:237,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:238,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:239,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:240,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:241,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:243,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:244,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:245,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:246,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:247,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:248,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:249,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:250,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:251,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:252,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:253,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:255,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:256,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:257,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:258,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:260,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:261,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:262,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:263,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:264,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:265,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:266,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:268,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:269,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:271,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:272,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:273,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:274,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:275,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:276,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:277,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:278,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:279,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:280,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:281,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:282,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W:283,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:284,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:287,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:288,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:289,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:290,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:291,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:292,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:293,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:294,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:295,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:296,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:297,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:163,  6: Unused variable \'edit\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -236,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -255,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -264,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.py
index d7301677156c5af046c95f0f4c456027a695f5e2..07a6ace0525246572a20664b44f4cec5110a1880 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.py
@@ -36,478 +36,478 @@ from Products.ERP5Type.Cache import clearCache
 
 class TestFolderMigration(ERP5TypeTestCase, LogInterceptor):
 
-    # Some helper methods
-
-    def getTitle(self):
-      return "Folder Migration"
-
-    def getBusinessTemplateList(self):
-      """
-        Return the list of business templates.
-      """
-      return tuple()
-
-    def afterSetUp(self):
-      """
-        Executed before each test_*.
-      """
-      self.login()
-      self.folder = self.portal.newContent(id='TestFolder',
-                                                portal_type='Folder')
-
-    def beforeTearDown(self):
-      """
-        Executed after each test_*.
-      """
-      self.folder.manage_delObjects(ids=list(self.folder.objectIds()))
-      self.portal.manage_delObjects(ids=[self.folder.getId(),])
-      clearCache()
-      self.tic()
-
-    def newContent(self, *args, **kwargs):
-      """
-        Create an object in self.folder and return it.
-      """
-      return self.folder.newContent(portal_type='Folder', *args, **kwargs)
-
-    def test_01_folderIsBtree(self):
-      """
-      Test the folder is a BTree
-      """
-      self.assertRaises(NotImplementedError, self.folder.getTreeIdList)
-      self.assertEqual(self.folder.isBTree(), True)
-      self.assertEqual(self.folder.isHBTree(), False)
-
-    def test_02_migrateFolder(self):
-      """
-      migrate folder from btree to hbtree
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script
-      self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
-                                  new_generate_id_method="_generatePerDayId")
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.getTreeIdList()), 1)
-      self.assertEqual(len(self.folder.objectIds()), 3)
-      # check params of objectIds in case of hbtree
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
-      self.assertEqual(len(self.folder.objectValues()), 3)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 0)
-      # check object ids
-      from DateTime import DateTime
-      date = DateTime().Date()
-      date = date.replace("/", "")
-      self.assertEqual(obj1.getId(), '%s-1' %date)
-      self.assertEqual(obj2.getId(), '%s-2' %date)
-      self.assertEqual(obj3.getId(), '%s-3' %date)
-      # add object and check its id
-      obj4 = self.newContent()
-      self.assertEqual(obj4.getId().split('-')[0], date)
-
-    def test_03_emptyFolderIsBtree(self):
-      """
-      Test the folder is a BTree
-      """
-      self.assertRaises(NotImplementedError, self.folder.getTreeIdList)
-      self.assertEqual(self.folder.isBTree(), True)
-      self.assertEqual(self.folder.isHBTree(), False)
-
-    def test_03a_filledFolderIsBtree(self):
-      """
-      Test the folder is a BTree
-      """
-      self.folder.newContent()
-      self.assertRaises(NotImplementedError, self.folder.getTreeIdList)
-      self.assertEqual(self.folder.isBTree(), True)
-      self.assertEqual(self.folder.isHBTree(), False)
-
-    def test_04_migrateEmptyFolder(self):
-      """
-      migrate empty folder from btree to hbtree
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      self.assertEqual(len(self.folder.objectIds()), 0)
-      # call migration script
-      self.folder.migrateToHBTree(migration_generate_id_method=None,
-                                  new_generate_id_method="_generatePerDayId")
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.objectIds()), 0)
-      # check new object ids
-      obj1 = self.newContent()
-      from DateTime import DateTime
-      date = DateTime().Date()
-      date = date.replace("/", "")
-      self.assertTrue(date in obj1.getId())
-      # check we still have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.objectIds()), 1)
-
-    def test_05_migrateFolderWithoutIdChange(self):
-      """
-      migrate folder from btree to hbtree, do not touch ids
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script with explicit new_generate_id_method (so migration code
-      # doesn't assign a good default
-      self.folder.migrateToHBTree(new_generate_id_method='_generateNextId')
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.getTreeIdList()), 1)
-      self.assertEqual(len(self.folder.objectIds()), 3)
-      # check params of objectIds in case of hbtree
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
-      self.assertEqual(len(self.folder.objectValues()), 3)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
-      # check object ids
-      self.assertEqual(obj1.getId(), '1')
-      self.assertEqual(obj2.getId(), '2')
-      self.assertEqual(obj3.getId(), '3')
-      # add object and check its id
-      obj4 = self.newContent()
-      self.assertEqual(obj4.getId(), '4')
-
-    def test_06_migrateFolderChangeIdGenerationMethodLater(self):
-      """
-      migrate folder from btree to hbtree, do not touch ids
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script with explicit new_generate_id_method (so migration code
-      # doesn't assign a good default
-      self.folder.migrateToHBTree(new_generate_id_method='_generateNextId')
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.getTreeIdList()), 1)
-      self.assertEqual(len(self.folder.objectIds()), 3)
-      # check params of objectIds in case of hbtree
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
-      self.assertEqual(len(self.folder.objectValues()), 3)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
-      # check object ids
-      self.assertEqual(obj1.getId(), '1')
-      self.assertEqual(obj2.getId(), '2')
-      self.assertEqual(obj3.getId(), '3')
-      # add object and check its id
-      obj4 = self.newContent()
-      self.assertEqual(obj4.getId(), '4')
-      # set id generator
-      id_generator_method = '_generatePerDayId'
-      self.folder.setIdGenerator(id_generator_method)
-      self.commit()
-      self.assertEqual(self.folder.getIdGenerator(), id_generator_method)
-      # check object ids
-      self.assertEqual(obj1.getId(), '1')
-      self.assertEqual(obj2.getId(), '2')
-      self.assertEqual(obj3.getId(), '3')
-      self.assertEqual(obj4.getId(), '4')
-      # add object and check its id
-      from DateTime import DateTime
-      date = DateTime().Date()
-      date = date.replace("/", "")
-
-      obj5 = self.newContent()
-      self.assertEqual(obj5.getId().split('-')[0], date)
-
-    def test_07_migrateFolderTwice(self):
-      """
-      migrate folder twice from btree to hbtree
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script
-      self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
-                                  new_generate_id_method="_generatePerDayId")
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.getTreeIdList()), 1)
-      self.assertEqual(len(self.folder.objectIds()), 3)
-      # check params of objectIds in case of hbtree
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
-      self.assertEqual(len(self.folder.objectValues()), 3)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 0)
-      # check object ids
-      from DateTime import DateTime
-      date = DateTime().Date()
-      date = date.replace("/", "")
-      self.assertEqual(obj1.getId(), '%s-1' %date)
-      self.assertEqual(obj2.getId(), '%s-2' %date)
-      self.assertEqual(obj3.getId(), '%s-3' %date)
-      # add object and check its id
-      obj4 = self.newContent()
-      self.assertEqual(obj4.getId().split('-')[0], date)
-      # call migration script again
-      self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
-                                  new_generate_id_method="_generatePerDayId")
-      self.tic()
-
-      # check object ids
-      self.assertEqual(obj1.getId(), '%s-1' %date)
-      self.assertEqual(obj2.getId(), '%s-2' %date)
-      self.assertEqual(obj3.getId(), '%s-3' %date)
-      self.assertEqual(obj4.getId().split('-')[0], date)
-
-    def test_08_migrateFolderTwiceSimultaneously(self):
-      """
-      migrate folder twice from btree to hbtree, simultaneously
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script twice
-      self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
-                                  new_generate_id_method="_generatePerDayId")
-      self.commit()
-      self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
-                                  new_generate_id_method="_generatePerDayId")
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.getTreeIdList()), 1)
-      self.assertEqual(len(self.folder.objectIds()), 3)
-      # check params of objectIds in case of hbtree
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
-      self.assertEqual(len(self.folder.objectValues()), 3)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 0)
-      # check object ids
-      from DateTime import DateTime
-      date = DateTime().Date()
-      date = date.replace("/", "")
-      self.assertEqual(obj1.getId(), '%s-1' %date)
-      self.assertEqual(obj2.getId(), '%s-2' %date)
-      self.assertEqual(obj3.getId(), '%s-3' %date)
-      # add object and check its id
-      obj4 = self.newContent()
-      self.assertEqual(obj4.getId().split('-')[0], date)
-
-    def test_09_migrateFolderCreateNewObjectAtOnce(self):
-      """
-      migrate folder from btree to hbtree, create object with base, without any
-      previous checks
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script
-      self.folder.migrateToHBTree()
-      self.tic()
-      obj4 = self.newContent(id='BASE-123')
-      self.assertEqual(obj4.getId(), 'BASE-123')
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
-      self.assertEqual(len(self.folder.objectValues()), 4)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
-      self.assertEqual(len(self.folder.objectIds(base_id='BASE')), 1)
-      self.assertEqual(len(self.folder.objectValues(base_id='BASE')), 1)
-
-    def test_10_migrateFolderCreateMoreObjectAtOnceDifferentBase(self):
-      """
-      migrate folder from btree to hbtree, create objects with two bases,
-      without any previous checks
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent()
-      self.assertEqual(obj3.getId(), '3')
-      self.tic()
-      # call migration script
-      self.folder.migrateToHBTree()
-      self.tic()
-      obj4 = self.newContent(id='BASE-123')
-      obj5 = self.newContent(id='BASE-BELONG-123')
-      self.assertEqual(obj4.getId(), 'BASE-123')
-      self.assertEqual(obj5.getId(), 'BASE-BELONG-123')
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
-      self.assertEqual(len(self.folder.objectValues()), 5)
-      self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
-      self.assertEqual(len(self.folder.objectIds(base_id='BASE')), 1)
-      self.assertEqual(len(self.folder.objectValues(base_id='BASE')), 1)
-      self.assertEqual(len(self.folder.objectIds(base_id='BASE-BELONG')), 1)
-      self.assertEqual(len(self.folder.objectValues(base_id='BASE-BELONG')), 1)
-
-    def test_11_folderInMigratedFolderIsBTree(self):
-      """
-      Test the folder in HBTree folder is a BTree
-      """
-      self.folder.migrateToHBTree()
-      self.tic()
-      infolder = self.newContent()
-
-      self.assertRaises(NotImplementedError, infolder.getTreeIdList)
-      self.assertEqual(infolder.isBTree(), True)
-      self.assertEqual(infolder.isHBTree(), False)
-
-    def test_12_migrateFolderWithGoodIdsInIt(self):
-      """
-      migrate folder from btree to hbtree folder, which already has ids
-      HBTree-friendly
-      """
-      id_prefix = 'BASE'
-      obj1_id = '%s-1'%(id_prefix,)
-      obj2_id = '%s-2'%(id_prefix,)
-      obj3_id = '%s-3'%(id_prefix,)
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent(id=obj1_id)
-      obj2 = self.newContent(id=obj2_id)
-      obj3 = self.newContent(id=obj3_id)
-      self.tic()
-      # call migration script
-      self.folder.migrateToHBTree()
-      self.tic()
-      # check we now have a hbtree
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-      self.assertEqual(len(self.folder.getTreeIdList()), 1)
-      self.assertEqual(len(self.folder.objectIds()), 3)
-      # check params of objectIds in case of hbtree
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
-      self.assertEqual(len(self.folder.objectValues()), 3)
-      self.assertEqual(len(self.folder.objectValues(base_id=id_prefix)), 3)
-      # add object without base
-      obj4 = self.newContent(id='1')
-      self.assertEqual(obj4.getId(), '1')
-      self.assertEqual(len(self.folder.objectIds(base_id=None)), 1)
-      self.assertEqual(len(self.folder.objectValues()), 4)
-      self.assertEqual(len(self.folder.objectValues(base_id=id_prefix)), 3)
-
-    def test_13_wrongFolderHandlerFix(self):
-      self.assertEqual(self.folder.isBTree(), True)
-      self.assertEqual(self.folder.isHBTree(), False)
-
-      self.folder._folder_handler = 'CMFBTreeFolderHandler'
-      self.tic()
-
-      self.assertEqual(self.folder.isHBTree(), False)
-
-      self.assertEqual(self.folder._fixFolderHandler(), True)
-      self.commit()
-
-      self.assertEqual(self.folder.isBTree(), True)
-      self.assertEqual(self.folder.isHBTree(), False)
-
-      self.folder.migrateToHBTree()
-      self.tic()
-
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-
-    def test_14_wrongFolderHandlerMigrate(self):
-      self.assertEqual(self.folder.isBTree(), True)
-      self.assertEqual(self.folder.isHBTree(), False)
-
-      self.folder._folder_handler = 'CMFBTreeFolderHandler'
-      self.tic()
-
-      self.assertEqual(self.folder.isHBTree(), False)
-
-      self.folder.migrateToHBTree()
-      self.tic()
-
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-
-      self.folder.newContent()
-      self.tic()
-
-      self.assertEqual(self.folder.isBTree(), False)
-      self.assertEqual(self.folder.isHBTree(), True)
-
-    def test_15_checkMigrationWorksIfIdsDontChange(self):
-      """
-      migrate folder using a script that leaves some objects with same ids
-      """
-      # Create some objects
-      self.assertEqual(self.folder.getIdGenerator(), '')
-      self.assertEqual(len(self.folder), 0)
-      obj1 = self.newContent()
-      self.assertEqual(obj1.getId(), '1')
-      obj2 = self.newContent()
-      self.assertEqual(obj2.getId(), '2')
-      obj3 = self.newContent(id='custom-id')
-      self.assertEqual(obj3.getId(), 'custom-id')
-      self.tic()
-      # call migration script Base_generateIdFromCreationDate that only changes int ids
-      self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromCreationDate",
-                                  new_generate_id_method="_generatePerDayId")
-      self.tic()
-      # check object ids
-      from DateTime import DateTime
-      date = DateTime().Date()
-      date = date.replace("/", "")
-      #1 y 2 should have new format id (because old ids were int)
-      self.assertEqual(obj1.getId(), '%s-1' % date)
-      self.assertEqual(obj2.getId(), '%s-2' % date)
-      #3 should have the same old id
-      self.assertEqual(obj3.getId(), 'custom-id')
+  # Some helper methods
+
+  def getTitle(self):
+    return "Folder Migration"
+
+  def getBusinessTemplateList(self):
+    """
+      Return the list of business templates.
+    """
+    return tuple()
+
+  def afterSetUp(self):
+    """
+      Executed before each test_*.
+    """
+    self.login()
+    self.folder = self.portal.newContent(id='TestFolder',
+                                              portal_type='Folder')
+
+  def beforeTearDown(self):
+    """
+      Executed after each test_*.
+    """
+    self.folder.manage_delObjects(ids=list(self.folder.objectIds()))
+    self.portal.manage_delObjects(ids=[self.folder.getId(),])
+    clearCache()
+    self.tic()
+
+  def newContent(self, *args, **kwargs):
+    """
+      Create an object in self.folder and return it.
+    """
+    return self.folder.newContent(portal_type='Folder', *args, **kwargs)
+
+  def test_01_folderIsBtree(self):
+    """
+    Test the folder is a BTree
+    """
+    self.assertRaises(NotImplementedError, self.folder.getTreeIdList)
+    self.assertEqual(self.folder.isBTree(), True)
+    self.assertEqual(self.folder.isHBTree(), False)
+
+  def test_02_migrateFolder(self):
+    """
+    migrate folder from btree to hbtree
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script
+    self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
+                                new_generate_id_method="_generatePerDayId")
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.getTreeIdList()), 1)
+    self.assertEqual(len(self.folder.objectIds()), 3)
+    # check params of objectIds in case of hbtree
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
+    self.assertEqual(len(self.folder.objectValues()), 3)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 0)
+    # check object ids
+    from DateTime import DateTime
+    date = DateTime().Date()
+    date = date.replace("/", "")
+    self.assertEqual(obj1.getId(), '%s-1' %date)
+    self.assertEqual(obj2.getId(), '%s-2' %date)
+    self.assertEqual(obj3.getId(), '%s-3' %date)
+    # add object and check its id
+    obj4 = self.newContent()
+    self.assertEqual(obj4.getId().split('-')[0], date)
+
+  def test_03_emptyFolderIsBtree(self):
+    """
+    Test the folder is a BTree
+    """
+    self.assertRaises(NotImplementedError, self.folder.getTreeIdList)
+    self.assertEqual(self.folder.isBTree(), True)
+    self.assertEqual(self.folder.isHBTree(), False)
+
+  def test_03a_filledFolderIsBtree(self):
+    """
+    Test the folder is a BTree
+    """
+    self.folder.newContent()
+    self.assertRaises(NotImplementedError, self.folder.getTreeIdList)
+    self.assertEqual(self.folder.isBTree(), True)
+    self.assertEqual(self.folder.isHBTree(), False)
+
+  def test_04_migrateEmptyFolder(self):
+    """
+    migrate empty folder from btree to hbtree
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    self.assertEqual(len(self.folder.objectIds()), 0)
+    # call migration script
+    self.folder.migrateToHBTree(migration_generate_id_method=None,
+                                new_generate_id_method="_generatePerDayId")
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.objectIds()), 0)
+    # check new object ids
+    obj1 = self.newContent()
+    from DateTime import DateTime
+    date = DateTime().Date()
+    date = date.replace("/", "")
+    self.assertTrue(date in obj1.getId())
+    # check we still have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.objectIds()), 1)
+
+  def test_05_migrateFolderWithoutIdChange(self):
+    """
+    migrate folder from btree to hbtree, do not touch ids
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script with explicit new_generate_id_method (so migration code
+    # doesn't assign a good default
+    self.folder.migrateToHBTree(new_generate_id_method='_generateNextId')
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.getTreeIdList()), 1)
+    self.assertEqual(len(self.folder.objectIds()), 3)
+    # check params of objectIds in case of hbtree
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
+    self.assertEqual(len(self.folder.objectValues()), 3)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
+    # check object ids
+    self.assertEqual(obj1.getId(), '1')
+    self.assertEqual(obj2.getId(), '2')
+    self.assertEqual(obj3.getId(), '3')
+    # add object and check its id
+    obj4 = self.newContent()
+    self.assertEqual(obj4.getId(), '4')
+
+  def test_06_migrateFolderChangeIdGenerationMethodLater(self):
+    """
+    migrate folder from btree to hbtree, do not touch ids
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script with explicit new_generate_id_method (so migration code
+    # doesn't assign a good default
+    self.folder.migrateToHBTree(new_generate_id_method='_generateNextId')
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.getTreeIdList()), 1)
+    self.assertEqual(len(self.folder.objectIds()), 3)
+    # check params of objectIds in case of hbtree
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
+    self.assertEqual(len(self.folder.objectValues()), 3)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
+    # check object ids
+    self.assertEqual(obj1.getId(), '1')
+    self.assertEqual(obj2.getId(), '2')
+    self.assertEqual(obj3.getId(), '3')
+    # add object and check its id
+    obj4 = self.newContent()
+    self.assertEqual(obj4.getId(), '4')
+    # set id generator
+    id_generator_method = '_generatePerDayId'
+    self.folder.setIdGenerator(id_generator_method)
+    self.commit()
+    self.assertEqual(self.folder.getIdGenerator(), id_generator_method)
+    # check object ids
+    self.assertEqual(obj1.getId(), '1')
+    self.assertEqual(obj2.getId(), '2')
+    self.assertEqual(obj3.getId(), '3')
+    self.assertEqual(obj4.getId(), '4')
+    # add object and check its id
+    from DateTime import DateTime
+    date = DateTime().Date()
+    date = date.replace("/", "")
+
+    obj5 = self.newContent()
+    self.assertEqual(obj5.getId().split('-')[0], date)
+
+  def test_07_migrateFolderTwice(self):
+    """
+    migrate folder twice from btree to hbtree
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script
+    self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
+                                new_generate_id_method="_generatePerDayId")
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.getTreeIdList()), 1)
+    self.assertEqual(len(self.folder.objectIds()), 3)
+    # check params of objectIds in case of hbtree
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
+    self.assertEqual(len(self.folder.objectValues()), 3)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 0)
+    # check object ids
+    from DateTime import DateTime
+    date = DateTime().Date()
+    date = date.replace("/", "")
+    self.assertEqual(obj1.getId(), '%s-1' %date)
+    self.assertEqual(obj2.getId(), '%s-2' %date)
+    self.assertEqual(obj3.getId(), '%s-3' %date)
+    # add object and check its id
+    obj4 = self.newContent()
+    self.assertEqual(obj4.getId().split('-')[0], date)
+    # call migration script again
+    self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
+                                new_generate_id_method="_generatePerDayId")
+    self.tic()
+
+    # check object ids
+    self.assertEqual(obj1.getId(), '%s-1' %date)
+    self.assertEqual(obj2.getId(), '%s-2' %date)
+    self.assertEqual(obj3.getId(), '%s-3' %date)
+    self.assertEqual(obj4.getId().split('-')[0], date)
+
+  def test_08_migrateFolderTwiceSimultaneously(self):
+    """
+    migrate folder twice from btree to hbtree, simultaneously
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script twice
+    self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
+                                new_generate_id_method="_generatePerDayId")
+    self.commit()
+    self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromStopDate",
+                                new_generate_id_method="_generatePerDayId")
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.getTreeIdList()), 1)
+    self.assertEqual(len(self.folder.objectIds()), 3)
+    # check params of objectIds in case of hbtree
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
+    self.assertEqual(len(self.folder.objectValues()), 3)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 0)
+    # check object ids
+    from DateTime import DateTime
+    date = DateTime().Date()
+    date = date.replace("/", "")
+    self.assertEqual(obj1.getId(), '%s-1' %date)
+    self.assertEqual(obj2.getId(), '%s-2' %date)
+    self.assertEqual(obj3.getId(), '%s-3' %date)
+    # add object and check its id
+    obj4 = self.newContent()
+    self.assertEqual(obj4.getId().split('-')[0], date)
+
+  def test_09_migrateFolderCreateNewObjectAtOnce(self):
+    """
+    migrate folder from btree to hbtree, create object with base, without any
+    previous checks
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script
+    self.folder.migrateToHBTree()
+    self.tic()
+    obj4 = self.newContent(id='BASE-123')
+    self.assertEqual(obj4.getId(), 'BASE-123')
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
+    self.assertEqual(len(self.folder.objectValues()), 4)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
+    self.assertEqual(len(self.folder.objectIds(base_id='BASE')), 1)
+    self.assertEqual(len(self.folder.objectValues(base_id='BASE')), 1)
+
+  def test_10_migrateFolderCreateMoreObjectAtOnceDifferentBase(self):
+    """
+    migrate folder from btree to hbtree, create objects with two bases,
+    without any previous checks
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent()
+    self.assertEqual(obj3.getId(), '3')
+    self.tic()
+    # call migration script
+    self.folder.migrateToHBTree()
+    self.tic()
+    obj4 = self.newContent(id='BASE-123')
+    obj5 = self.newContent(id='BASE-BELONG-123')
+    self.assertEqual(obj4.getId(), 'BASE-123')
+    self.assertEqual(obj5.getId(), 'BASE-BELONG-123')
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 3)
+    self.assertEqual(len(self.folder.objectValues()), 5)
+    self.assertEqual(len(self.folder.objectValues(base_id=None)), 3)
+    self.assertEqual(len(self.folder.objectIds(base_id='BASE')), 1)
+    self.assertEqual(len(self.folder.objectValues(base_id='BASE')), 1)
+    self.assertEqual(len(self.folder.objectIds(base_id='BASE-BELONG')), 1)
+    self.assertEqual(len(self.folder.objectValues(base_id='BASE-BELONG')), 1)
+
+  def test_11_folderInMigratedFolderIsBTree(self):
+    """
+    Test the folder in HBTree folder is a BTree
+    """
+    self.folder.migrateToHBTree()
+    self.tic()
+    infolder = self.newContent()
+
+    self.assertRaises(NotImplementedError, infolder.getTreeIdList)
+    self.assertEqual(infolder.isBTree(), True)
+    self.assertEqual(infolder.isHBTree(), False)
+
+  def test_12_migrateFolderWithGoodIdsInIt(self):
+    """
+    migrate folder from btree to hbtree folder, which already has ids
+    HBTree-friendly
+    """
+    id_prefix = 'BASE'
+    obj1_id = '%s-1'%(id_prefix,)
+    obj2_id = '%s-2'%(id_prefix,)
+    obj3_id = '%s-3'%(id_prefix,)
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    self.newContent(id=obj1_id)
+    self.newContent(id=obj2_id)
+    self.newContent(id=obj3_id)
+    self.tic()
+    # call migration script
+    self.folder.migrateToHBTree()
+    self.tic()
+    # check we now have a hbtree
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+    self.assertEqual(len(self.folder.getTreeIdList()), 1)
+    self.assertEqual(len(self.folder.objectIds()), 3)
+    # check params of objectIds in case of hbtree
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 0)
+    self.assertEqual(len(self.folder.objectValues()), 3)
+    self.assertEqual(len(self.folder.objectValues(base_id=id_prefix)), 3)
+    # add object without base
+    obj4 = self.newContent(id='1')
+    self.assertEqual(obj4.getId(), '1')
+    self.assertEqual(len(self.folder.objectIds(base_id=None)), 1)
+    self.assertEqual(len(self.folder.objectValues()), 4)
+    self.assertEqual(len(self.folder.objectValues(base_id=id_prefix)), 3)
+
+  def test_13_wrongFolderHandlerFix(self):
+    self.assertEqual(self.folder.isBTree(), True)
+    self.assertEqual(self.folder.isHBTree(), False)
+
+    self.folder._folder_handler = 'CMFBTreeFolderHandler'
+    self.tic()
+
+    self.assertEqual(self.folder.isHBTree(), False)
+
+    self.assertEqual(self.folder._fixFolderHandler(), True)
+    self.commit()
+
+    self.assertEqual(self.folder.isBTree(), True)
+    self.assertEqual(self.folder.isHBTree(), False)
+
+    self.folder.migrateToHBTree()
+    self.tic()
+
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+
+  def test_14_wrongFolderHandlerMigrate(self):
+    self.assertEqual(self.folder.isBTree(), True)
+    self.assertEqual(self.folder.isHBTree(), False)
+
+    self.folder._folder_handler = 'CMFBTreeFolderHandler'
+    self.tic()
+
+    self.assertEqual(self.folder.isHBTree(), False)
+
+    self.folder.migrateToHBTree()
+    self.tic()
+
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+
+    self.folder.newContent()
+    self.tic()
+
+    self.assertEqual(self.folder.isBTree(), False)
+    self.assertEqual(self.folder.isHBTree(), True)
+
+  def test_15_checkMigrationWorksIfIdsDontChange(self):
+    """
+    migrate folder using a script that leaves some objects with same ids
+    """
+    # Create some objects
+    self.assertEqual(self.folder.getIdGenerator(), '')
+    self.assertEqual(len(self.folder), 0)
+    obj1 = self.newContent()
+    self.assertEqual(obj1.getId(), '1')
+    obj2 = self.newContent()
+    self.assertEqual(obj2.getId(), '2')
+    obj3 = self.newContent(id='custom-id')
+    self.assertEqual(obj3.getId(), 'custom-id')
+    self.tic()
+    # call migration script Base_generateIdFromCreationDate that only changes int ids
+    self.folder.migrateToHBTree(migration_generate_id_method="Base_generateIdFromCreationDate",
+                                new_generate_id_method="_generatePerDayId")
+    self.tic()
+    # check object ids
+    from DateTime import DateTime
+    date = DateTime().Date()
+    date = date.replace("/", "")
+    #1 y 2 should have new format id (because old ids were int)
+    self.assertEqual(obj1.getId(), '%s-1' % date)
+    self.assertEqual(obj2.getId(), '%s-2' % date)
+    #3 should have the same old id
+    self.assertEqual(obj3.getId(), 'custom-id')
 
 def test_suite():
   suite = unittest.TestSuite()
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.xml
index 6948df6a7e41ae9fd23c92194189dfa881789ca5..f7383b214f96293187deec977dac24880b058e52 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testFolderMigration.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testFolderMigration</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testFolderMigration</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testFolderMigration</string> </value>
@@ -37,324 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 41,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 42,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 44,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 45,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 48,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 50,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 51,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 54,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 55,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 58,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 59,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 62,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 63,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 64,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 65,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 67,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 68,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 71,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 73,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 74,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 77,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 78,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 79,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 81,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 82,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 86,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 87,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 88,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 89,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 90,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 91,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 92,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 93,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 94,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 96,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 98,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:100,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:101,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:102,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:103,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:105,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:106,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:107,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:109,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:110,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:111,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:112,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:113,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:114,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:116,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:117,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:119,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:120,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:123,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:124,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:125,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:127,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:128,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:131,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:132,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:133,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:134,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:136,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:137,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:141,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:142,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:143,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:145,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:147,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:149,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:150,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:151,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:153,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:154,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:155,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:156,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:157,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:159,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:160,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:161,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:163,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:164,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:168,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:169,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:170,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:171,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:172,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:173,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:174,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:175,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:176,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:179,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:180,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:182,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:183,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:184,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:185,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:187,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:188,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:189,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:191,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:192,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:193,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:195,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:196,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:198,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:199,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:203,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:204,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:205,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:206,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:207,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:208,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:209,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:210,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:211,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:214,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:215,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:217,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:218,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:219,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:220,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:222,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:223,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:224,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:226,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:227,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:228,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:230,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:231,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:233,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:234,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:235,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:236,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:238,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:239,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:240,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:241,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:243,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:244,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:245,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:247,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:248,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:250,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:251,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:255,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:256,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:257,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:258,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:259,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:260,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:261,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:262,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:263,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:265,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:267,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:269,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:270,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:271,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:272,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:274,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:275,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:276,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:278,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:279,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:280,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:281,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:282,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:283,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:285,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:286,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:288,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:290,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:293,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:294,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:295,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:296,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:298,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:299,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:303,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:304,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:305,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:306,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:307,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:308,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:309,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:310,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:311,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:313,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:315,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:316,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:318,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:320,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:321,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:322,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:323,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:325,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:326,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:327,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:329,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:330,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:331,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:332,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:333,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:334,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:336,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:337,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:339,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:340,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:345,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:346,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:347,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:348,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:349,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:350,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:351,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:352,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:353,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:355,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:356,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:357,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:358,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:359,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:360,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:361,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:362,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:363,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:365,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:366,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:371,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:372,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:373,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:374,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:375,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:376,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:377,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:378,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:379,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:381,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:382,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:383,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:384,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:385,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:386,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:387,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:388,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:389,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:390,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:391,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:392,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:393,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:395,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:396,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:399,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:400,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:401,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:403,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:404,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:405,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:407,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:408,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:412,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:413,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:414,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:415,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:417,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:418,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:419,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:420,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:421,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:422,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:424,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:425,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:427,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:428,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:429,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:430,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:432,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:433,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:434,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:436,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:437,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:438,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:439,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:440,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:442,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:443,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:444,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:446,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:447,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:449,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:451,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:452,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:454,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:455,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:457,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:458,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:460,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:461,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:463,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W:464,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:465,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:467,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:468,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:470,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:472,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:473,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:475,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:476,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:478,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:479,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:481,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:482,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:419,  6: Unused variable \'obj1\' (unused-variable)</string>
-                <string>W:421,  6: Unused variable \'obj3\' (unused-variable)</string>
-                <string>W:420,  6: Unused variable \'obj2\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -364,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -383,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -392,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.py
index b3e22d2ecc0ed085d7f0901c5cc4ab1eb0c80ce1..1448037dd7a79a7e98b082fa2a9a67fbe99341cb 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.py
@@ -26,13 +26,11 @@
 #
 ##############################################################################
 
-import unittest
-
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-from AccessControl.SecurityManagement import newSecurityManager
 from Products.ERP5Type.tests.Sequence import SequenceList
 from Products.ERP5Type.tests.utils import createZODBPythonScript
 
+
 class TestGeographicalAddress(ERP5TypeTestCase):
   """
   ERP5 Geographical Address related tests.
@@ -41,7 +39,6 @@ class TestGeographicalAddress(ERP5TypeTestCase):
   on a Geographical Address returns the standard text format.
   """
 
-  run_all_test = 1
   entity_portal_type = 'Person'
   address_portal_type = 'Address'
   street_address_text = "rue Truc"
@@ -49,37 +46,7 @@ class TestGeographicalAddress(ERP5TypeTestCase):
   zip_code_text = "12345"
   city_text = "City1"
 
-  def getTitle(self):
-    return "Geographical Address"
-
-  def getBusinessTemplateList(self):
-    """
-    """
-    return ('erp5_base', )
-
-  def login(self, quiet=0, run=run_all_test):
-    uf = self.getPortal().acl_users
-    uf._doAddUser('rc', '', ['Manager'], [])
-    user = uf.getUserById('rc').__of__(uf)
-    newSecurityManager(None, user)
-
-  def enableLightInstall(self):
-    """
-    You can override this.
-    Return if we should do a light install (1) or not (0)
-    """
-    return 1
-
-  def enableActivityTool(self):
-    """
-    You can override this.
-    Return if we should create (1) or not (0) an activity tool.
-    """
-    return 1
-
-  def afterSetUp(self, quiet=1, run=run_all_test):
-    self.login()
-    self.portal = self.getPortal()
+  def afterSetUp(self):
     self.category_tool = self.getCategoryTool()
     self.createCategories()
 
@@ -91,7 +58,7 @@ class TestGeographicalAddress(ERP5TypeTestCase):
     region_category_list = ['country1', 'country2', ]
     if len(self.category_tool.region.contentValues()) == 0 :
       for category_id in region_category_list:
-        o = self.category_tool.region.newContent(portal_type='Category',
+        self.category_tool.region.newContent(portal_type='Category',
                                                id=category_id,
                                                title=category_id.capitalize())
     self.region_category_list = ['region/%s' % x for x \
@@ -101,7 +68,7 @@ class TestGeographicalAddress(ERP5TypeTestCase):
     """
     Create an entity
     """
-    portal = self.getPortal()
+    portal = self.portal
     module = portal.getDefaultModule(self.entity_portal_type)
     entity = module.newContent(portal_type=self.entity_portal_type)
     sequence.edit(
@@ -141,12 +108,10 @@ class TestGeographicalAddress(ERP5TypeTestCase):
                           self.zip_code_text,
                           self.city_text,))
 
-  def test_01_standardAddress(self, quiet=0, run=run_all_test):
+  def test_01_standardAddress(self):
     """
       Test property existence
     """
-    if not run: return
-
     sequence_list = SequenceList()
     sequence_string = '\
               CreateEntity \
@@ -161,7 +126,7 @@ class TestGeographicalAddress(ERP5TypeTestCase):
     """
     This script returns a different address format.
     """
-    createZODBPythonScript(self.getPortal().portal_skins.custom,
+    createZODBPythonScript(self.portal.portal_skins.custom,
                            'Address_asText', '', """
 return '%s\\n%s %s COUNTRY' % \\
        (context.getStreetAddress(),
@@ -180,12 +145,10 @@ return '%s\\n%s %s COUNTRY' % \\
                           self.zip_code_text,
                           self.city_text))
 
-  def test_02_asTextScript(self, quiet=0, run=run_all_test):
+  def test_02_asTextScript(self):
     """
       Test property existence
     """
-    if not run: return
-
     sequence_list = SequenceList()
     sequence_string = '\
               CreateEntity \
@@ -197,7 +160,3 @@ return '%s\\n%s %s COUNTRY' % \\
     sequence_list.addSequenceString(sequence_string)
     sequence_list.play(self)
 
-def test_suite():
-  suite = unittest.TestSuite()
-  suite.addTest(unittest.makeSuite(TestGeographicalAddress))
-  return suite
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.xml
index 33799f9d5fd0383669ca2133770662bc51f8c243..1ca8c7d83e7d9ebd174a74ab0d5aef721f47fe45 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testGeographicalAddress.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testGeographicalAddress</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testGeographicalAddress</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testGeographicalAddress</string> </value>
@@ -37,10 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 80,  2: Arguments number differs from overridden \'afterSetUp\' method (arguments-differ)</string>
-                <string>W: 94,  8: Unused variable \'o\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -50,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -69,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -78,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.py
index ba3501ca9ce5cfb53166a6604fd7c0bb91e2e513..5d30d60e3be18b76b3485858c877b127cd15399b 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.py
@@ -138,9 +138,9 @@ class TestIdToolUpgrade(ERP5TypeTestCase):
     bt = self.portal.portal_templates.getInstalledBusinessTemplate('erp5_core',
                                                                   strict=True)
     for path, obj in bt._path_item._objects.iteritems():
-        path, obj_id = path.rsplit('/', 1)
-        if path == 'portal_ids':
-            id_tool._setObject(obj_id, obj._getCopy(bt))
+      path, obj_id = path.rsplit('/', 1)
+      if path == 'portal_ids':
+        id_tool._setObject(obj_id, obj._getCopy(bt))
     self.tic()
     id_list = id_tool.generateNewLengthIdList(id_group='foo')
     # it is known that with current upgrade there is a hole
@@ -173,7 +173,7 @@ class TestIdToolUpgrade(ERP5TypeTestCase):
 
   def _setUpLastMaxIdDict(self, id_generator_reference):
     def countup(id_generator, id_group, until):
-      for i in xrange(until + 1):
+      for _ in xrange(until + 1):
         self.id_tool.generateNewId(id_generator=id_generator_reference,
                                    id_group=id_group)
 
@@ -251,14 +251,14 @@ class TestIdToolUpgrade(ERP5TypeTestCase):
     self._setUpLastMaxIdDict(id_generator_reference)
 
     # test migration: PersistentMapping to OOBTree
-    self.assertTrue(isinstance(last_id_dict, PersistentMapping))
+    self.assertIsInstance(last_id_dict, PersistentMapping)
     self._assertIdGeneratorLastMaxIdDict(id_generator)
     id_generator.rebuildGeneratorIdDict() # migrate the dict
     self._assertIdGeneratorLastMaxIdDict(id_generator)
 
     # test migration: OOBTree to OOBTree. this changes nothing, just to be sure
     last_id_dict = self._getLastIdDict(id_generator)
-    self.assertTrue(isinstance(last_id_dict, OOBTree))
+    self.assertIsInstance(last_id_dict, OOBTree)
     self._assertIdGeneratorLastMaxIdDict(id_generator)
     id_generator.rebuildGeneratorIdDict() # migrate the dict
     self._assertIdGeneratorLastMaxIdDict(id_generator)
@@ -268,8 +268,8 @@ class TestIdToolUpgrade(ERP5TypeTestCase):
       'SQL Non Continuous Increasing Id Generator':
       self._setLastIdDict(id_generator, OOBTree()) # set empty one
       last_id_dict = self._getLastIdDict(id_generator)
-      assert(len(last_id_dict), 0) # 0 because it is empty
-      self.assertTrue(isinstance(last_id_dict, OOBTree))
+      self.assertEqual(len(last_id_dict), 0) # 0 because it is empty
+      self.assertIsInstance(last_id_dict, OOBTree)
       # migrate the dict totally from sql table in this case
       id_generator.rebuildGeneratorIdDict()
       self._assertIdGeneratorLastMaxIdDict(id_generator)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.xml
index 3f7247f99de291a5d80cd15593f39b792a16242d..f5c7761e1302c94f0958fbf720559a67d2fb6f02 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIdToolUpgrade.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testIdToolUpgrade</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testIdToolUpgrade</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testIdToolUpgrade</string> </value>
@@ -37,13 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W:141,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W:142,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W:143,  0: Bad indentation. Found 12 spaces, expected 8 (bad-indentation)</string>
-                <string>W:176, 10: Unused variable \'i\' (unused-variable)</string>
-                <string>W:271,  6: Assert called on a 2-uple. Did you mean \'assert x,y\'? (assert-on-tuple)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -53,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -72,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -81,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.py
index c4aa93d53bc57fcd5851d92cef5f3a6c5f415006..1cddf3d63b784cb799fa34745f691e5333983422 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.py
@@ -35,6 +35,7 @@ from Products.ERP5Type.Base import _aq_reset
 from AccessControl import ClassSecurityInfo
 from Products.ERP5Type.Workflow import addWorkflowByType
 
+
 class TestInteractionWorkflow(ERP5TypeTestCase):
   portal_type = 'Organisation'
 
@@ -78,11 +79,9 @@ class TestInteractionWorkflow(ERP5TypeTestCase):
     return addWorkflowByType(wf_tool, "interaction_workflow", wf_id)
 
   def createInteractionWorkflow(self):
-    id = 'test_workflow'
-    wf_type = "interaction_workflow"
-    if getattr(self.getWorkflowTool(), id, None) is None:
-      self._createInteractionWorkflowWithId(id)
-    wf = self.getWorkflowTool()[id]
+    if getattr(self.getWorkflowTool(), 'test_workflow', None) is None:
+      self._createInteractionWorkflowWithId('test_workflow')
+    wf = self.getWorkflowTool()['test_workflow']
     self.wf = wf
     if getattr(wf.scripts, 'afterEdit', None) is None:
       wf.scripts.manage_addProduct['PythonScripts']\
@@ -96,9 +95,7 @@ class TestInteractionWorkflow(ERP5TypeTestCase):
     _aq_reset() # XXX Fails XXX _setLastId not found when doing newContent
 
   def createInteractionWorkflowWithTwoInteractions(self):
-    id = 'test_workflow'
-    wf_type = "interaction_workflow (Web-configurable interaction workflow)"
-    wf = self._createInteractionWorkflowWithId(id)
+    wf = self._createInteractionWorkflowWithId('test_workflow')
     self.wf = wf
     wf.scripts.manage_addProduct['PythonScripts']\
                   .manage_addPythonScript(id='afterEditA')
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.xml
index 08f3aaca5628402f06a3d554d437a6c24ee91550..52090a370e61b70095cd89e2b7736f17e2ac85d9 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testInteractionWorkflow.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testInteractionWorkflow</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testInteractionWorkflow</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testInteractionWorkflow</string> </value>
@@ -37,12 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 82,  4: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W: 83,  4: Unused variable \'wf_type\' (unused-variable)</string>
-                <string>W:100,  4: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:101,  4: Unused variable \'wf_type\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -52,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -71,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -80,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.py
index 3612c80d8c0abe2f083f58b989e6310a32e5165c..821310738e29e693ee605005d2c4a924388d7d4d 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.py
@@ -26,34 +26,14 @@
 #
 ##############################################################################
 
-import unittest
-
-from AccessControl.SecurityManagement import newSecurityManager
+import json
 
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-import json
 
 
 class TestIntrospectionTool(ERP5TypeTestCase):
-  def getBusinessTemplateList(self):
-    """  """
-    return ('erp5_base',)
-
-  def afterSetUp(self):
-    self.portal = self.getPortal()
-    self.login()
-
-  def login(self):
-    uf = self.getPortal().acl_users
-    uf._doAddUser('seb', '', ['Manager'], [])
-    uf._doAddUser('ERP5TypeTestCase', '', ['Manager'], [])
-    user = uf.getUserById('seb').__of__(uf)
-    newSecurityManager(None, user)
 
   def test_getSystemSignatureJSON(self):
-    """
-      Test
-    """
     signature_json = self.portal.portal_introspections.getSystemSignatureAsJSON()
     signature_by_json = json.loads(signature_json)
     signature = self.portal.portal_introspections.getSystemSignatureDict()
@@ -62,7 +42,3 @@ class TestIntrospectionTool(ERP5TypeTestCase):
     for key in signature:
       self.assertEqual(signature[key], signature_by_json[key])
 
-def test_suite():
-  suite = unittest.TestSuite()
-  suite.addTest(unittest.makeSuite(TestIntrospectionTool))
-  return suite
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.xml
index 1c1ba9990e96b4602a8a4bd49c6e10350a9706a1..aa314a1c9e8c1581c7b500d094bf2b5109265349 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testIntrospectionTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testIntrospectionTool</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testIntrospectionTool</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testIntrospectionTool</string> </value>
@@ -37,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 46,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -49,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -68,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -77,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.py
index 45b226f3f6e14cfdbd1765347ee61e3a12724c7c..64d4083286d519f9f0824b94eddc0ce083ec6fff 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.py
@@ -150,7 +150,7 @@ class TestLocalizer(ERP5TypeTestCase):
       {'fr':"C'est 1€.", 'note':'',})
     localizer = portal.Localizer
 
-    test_script = createZODBPythonScript(portal.portal_skins.custom,
+    createZODBPythonScript(portal.portal_skins.custom,
         'test_script', '', """
 def assertEquals(a, b):
   if a != b:
@@ -191,7 +191,6 @@ assertEquals("This is 1€.", context.Base_translateString("This is 1€."))
     value (e.g. the original message) must be returned
     """
     message = "   This is 1€ non-translated    "
-    localizer = self.portal.Localizer
 
     # Base_translateString == Localizer.translate() currently, which calls
     # zope.i18n.translate and sets 'default' to 'message' before passing it to
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.xml
index b1358499fb1aea810f757f27c54d8dc6122f651b..f79631a40ce19492d2e43bfa90c104dd5695f65f 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testLocalizer.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testLocalizer</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testLocalizer</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testLocalizer</string> </value>
@@ -37,10 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W:153,  4: Unused variable \'test_script\' (unused-variable)</string>
-                <string>W:194,  4: Unused variable \'localizer\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -50,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -69,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -78,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.py
index 8a9d928d3fb922c760d2908f64320d01ab8ad2fe..8a2950f11ac0321192923b5f963301cb0465a03b 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.py
@@ -74,11 +74,8 @@ class TestMemcachedTool(ERP5TypeTestCase):
     self.tic()
 
   def afterSetUp(self):
-    self.login()
-
-  def login(self):
     uf = self.portal.acl_users
-    uf._doAddUser('vincent', '', ['Manager'], [])
+    uf._doAddUser('vincent', self.newPassword(), ['Manager'], [])
     user = uf.getUserById('vincent').__of__(uf)
     newSecurityManager(None, user)
 
@@ -104,6 +101,7 @@ class TestMemcachedTool(ERP5TypeTestCase):
     memcached_tool = self.portal.portal_memcached
     try:
       import memcache
+      del memcache
     except ImportError:
       # MemcachedTool should be disabled
       self.assertRaises(RuntimeError, memcached_tool.getMemcachedDict)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.xml
index bb8a8bee13e29da3e0e7d9858895923ee10a0f51..288b40dbfa02306b726c8acbe4dc35bc46dc0ebb 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testMemcachedTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testMemcachedTool</string> </value>
@@ -43,10 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 79,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-                <string>W:106,  6: Unused variable \'memcache\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -56,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -75,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -84,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.py
index 680051f92b836833bf1ea3afdad4428877ac0899..094bf0f437c3e486fe45f633ed6fdaed5c7de311 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.py
@@ -39,12 +39,9 @@ class TestNotificationMessageModule(ERP5TypeTestCase):
   def getBusinessTemplateList(self):
     return ('erp5_base',)
 
-  def createUser(self, name, role_list):
-    self.portal.acl_users._doAddUser(name, self.newPassword(), role_list, [])
-
   def afterSetUp(self):
-    self.createUser('erp5user', ['Auditor', 'Author'])
-    self.createUser('manager', ['Manager'])
+    self.portal.acl_users._doAddUser('erp5user', self.newPassword(), ['Auditor', 'Author'], [])
+    self.portal.acl_users._doAddUser('manager', self.newPassword(), ['Manager'], [])
     self.portal.email_from_address = 'site@example.invalid'
     self.loginByUserName('erp5user')
 
@@ -130,7 +127,7 @@ class TestNotificationMessageModule(ERP5TypeTestCase):
                             text_content_substitution_mapping_method_id=
                             'NotificationMessage_getDummySubstitionMapping')
 
-    mime, text = doc.convert('txt',
+    _, text = doc.convert('txt',
                              substitution_method_parameter_dict=dict(a='b'))
     self.assertEqual('substitution text: b', text.rstrip())
 
@@ -148,7 +145,7 @@ class TestNotificationMessageModule(ERP5TypeTestCase):
                             text_content_substitution_mapping_method_id=
                             'NotificationMessage_getDummySubstitionMapping')
 
-    mime, text = doc.convert('txt')
+    _, text = doc.convert('txt')
     self.assertEqual('substitution text: b', text.rstrip())
 
   def test_safe_substitution_content(self):
@@ -167,7 +164,7 @@ class TestNotificationMessageModule(ERP5TypeTestCase):
                             text_content_substitution_mapping_method_id=
                             'NotificationMessage_getDummySubstitionMapping')
 
-    mime, text = doc.convert('txt')
+    _, text = doc.convert('txt')
     self.assertEqual('substitution text: ${b}', text.rstrip())
     self.assertEqual('${b}', doc.asSubjectText())
 
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.xml
index 6fc60727e9a71eb4f144e7269d43076ca9c4fbbe..682c69c2894c760f3a137cf632f258064ee69ccc 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationMessageModule.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testNotificationMessageModule</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testNotificationMessageModule</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testNotificationMessageModule</string> </value>
@@ -37,12 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 49,  2: Arguments number differs from overridden \'createUser\' method (arguments-differ)</string>
-                <string>W:149,  4: Unused variable \'mime\' (unused-variable)</string>
-                <string>W:168,  4: Unused variable \'mime\' (unused-variable)</string>
-                <string>W:187,  4: Unused variable \'mime\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -52,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -71,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -80,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.py
index 1d5936f760fcfdfdacc56c459a9845cd88c798e3..e793070cbd7b0ea6fd1c876bc3e6a59e11b8dedb 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.py
@@ -38,7 +38,7 @@ from email.header import decode_header, make_header
 from email.utils import parseaddr
 
 # Copied from ERP5Type/patches/CMFMailIn.py
-def decode_email(file):
+def decode_email(file_):
   # Prepare result
   theMail = {
     'attachment_list': [],
@@ -47,9 +47,9 @@ def decode_email(file):
     'headers': {}
   }
   # Get Message
-  msg = email.message_from_string(file)
+  msg = email.message_from_string(file_)
   # Back up original file
-  theMail['__original__'] = file
+  theMail['__original__'] = file_
   # Recode headers to UTF-8 if needed
   for key, value in msg.items():
     decoded_value_list = decode_header(value)
@@ -61,7 +61,7 @@ def decode_email(file):
                  'to', 'from', 'cc', 'sender', 'reply-to'):
     header_field = theMail['headers'].get(header)
     if header_field:
-        theMail['headers'][header] = parseaddr(header_field)[1]
+      theMail['headers'][header] = parseaddr(header_field)[1]
   # Get attachments
   body_found = 0
   for part in msg.walk():
@@ -107,7 +107,7 @@ class TestNotificationTool(ERP5TypeTestCase):
   def getTitle(self):
     return "Notification Tool"
 
-  def createUser(self, name, role_list):
+  def createUser(self, name, role_list): # pylint:disable=arguments-differ
     user_folder = self.getPortal().acl_users
     user_folder._doAddUser(name, 'password', role_list, [])
 
@@ -196,8 +196,8 @@ class TestNotificationTool(ERP5TypeTestCase):
     self.portal.portal_notifications.sendMessage(
         recipient=sequence['user_a_id'], subject='Subject', message='Message')
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
-    mfrom, mto, messageText = last_message
+    self.assertNotEqual(last_message, ())
+    mfrom, mto, _ = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
 
@@ -236,8 +236,8 @@ class TestNotificationTool(ERP5TypeTestCase):
     self.portal.portal_notifications.sendMessage(
         subject='Subject', message='Message')
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
-    mfrom, mto, messageText = last_message
+    self.assertNotEqual(last_message, ())
+    mfrom, mto, _ = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['site@example.invalid'], mto)
 
@@ -249,8 +249,8 @@ class TestNotificationTool(ERP5TypeTestCase):
     self.portal.portal_notifications.sendMessage(
         recipient=sequence['user_a_id'], subject='Subject', )
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
-    mfrom, mto, messageText = last_message
+    self.assertNotEqual(last_message, ())
+    mfrom, mto, _ = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
 
@@ -272,7 +272,7 @@ class TestNotificationTool(ERP5TypeTestCase):
     self.portal.portal_notifications.sendMessage(
         recipient=sequence['user_a_id'], subject='Subject', message='Message')
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
+    self.assertNotEqual(last_message, ())
     mfrom, mto, messageText = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
@@ -313,7 +313,7 @@ class TestNotificationTool(ERP5TypeTestCase):
         ])
     last_message = self.portal.MailHost._last_message
 
-    self.assertNotEquals((), last_message)
+    self.assertNotEqual(last_message, ())
     mfrom, mto, messageText = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
@@ -345,14 +345,14 @@ class TestNotificationTool(ERP5TypeTestCase):
         recipient=[sequence['user_a_id'], sequence['user_b_id']], subject='Subject', message='Message')
     last_message = self.portal.MailHost._last_message
 
-    self.assertNotEquals((), last_message)
-    mfrom, mto, messageText = last_message
+    self.assertNotEqual(last_message, ())
+    mfrom, mto, _ = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userB@example.invalid'], mto)
 
     previous_message = self.portal.MailHost._previous_message
-    self.assertNotEquals((), previous_message)
-    mfrom, mto, messageText = previous_message
+    self.assertNotEqual(last_message, ())
+    mfrom, mto, _ = previous_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
 
@@ -400,7 +400,7 @@ class TestNotificationTool(ERP5TypeTestCase):
     self.portal.portal_notifications.sendMessage(
         recipient=person.getObject(), subject='Subject', message='Message')
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
+    self.assertNotEqual(last_message, ())
     mfrom, mto, messageText = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
@@ -434,7 +434,7 @@ Yes, I will go."""
         recipient=sequence['user_a_id'], subject='Subject',
         message_text_format='text/plain', message=message)
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
+    self.assertNotEqual(last_message, ())
     mfrom, mto, messageText = last_message
     self.assertEqual('Portal Administrator <site@example.invalid>', mfrom)
     self.assertEqual(['userA@example.invalid'], mto)
@@ -493,7 +493,7 @@ Yes, I will go."""
     self.portal.portal_notifications.sendMessage(
         recipient=sequence['user_a_id'], subject='Subject', message='Message')
     last_message = self.portal.MailHost._last_message
-    self.assertNotEquals((), last_message)
+    self.assertNotEqual(last_message, ())
 
   def test_permission_on_recipient_not_needed(self):
     """Notification Tool can be used to send Messages even when user does not
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.xml
index 17d7a568bfc8f12879846e7870ec13d02fd0ec0a..a273861b829d74d7b41754b215e919b99213249c 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testNotificationTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testNotificationTool</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testNotificationTool</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testNotificationTool</string> </value>
@@ -37,15 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 64,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W: 41, 17: Redefining built-in \'file\' (redefined-builtin)</string>
-                <string>W:110,  2: Arguments number differs from overridden \'createUser\' method (arguments-differ)</string>
-                <string>W:200, 16: Unused variable \'messageText\' (unused-variable)</string>
-                <string>W:240, 16: Unused variable \'messageText\' (unused-variable)</string>
-                <string>W:253, 16: Unused variable \'messageText\' (unused-variable)</string>
-                <string>W:349, 16: Unused variable \'messageText\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -55,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -74,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -83,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.py
index 0f4d9ada5a4c65eeea63d12132f0c566899ef438..6cd35e973c01ec9cdf080b00d9645e66a59dfd6d 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.py
@@ -29,7 +29,6 @@
 import unittest
 
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-from AccessControl.SecurityManagement import newSecurityManager
 from Products.ERP5Type.tests.Sequence import SequenceList
 from erp5.component.tool.SessionTool import SESSION_CACHE_FACTORY
 from string import letters as LETTERS
@@ -47,27 +46,6 @@ class TestSessionTool(ERP5TypeTestCase):
 
   session_id = "123456789"
 
-  def getTitle(self):
-    return "Session Tool"
-
-  def afterSetUp(self):
-    # create a Memcached Plugin
-    memcached_tool = self.portal.portal_memcached
-    #create Memcache Plugin
-    if getattr(memcached_tool, 'default_memcached_plugin', None) is None:
-      memcached_tool.newContent(id='default_memcached_plugin',
-                                portal_type='Memcached Plugin',
-                                int_index=0,
-                                url_string='127.0.0.1:11211')
-    self.login()
-
-  def login(self):
-    uf = self.portal.acl_users
-    uf._doAddUser('ivan', '', ['Manager'], [])
-    uf._doAddUser('ERP5TypeTestCase', '', ['Manager'], [])
-    user = uf.getUserById('ivan').__of__(uf)
-    newSecurityManager(None, user)
-
   def _changeCachePlugin(self, portal_type, storage_duration = 86400):
     """ Change current cache plugin with new one. """
     portal_caches = self.portal.portal_caches
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.xml
index 938b12f1773a57afa87a3d6c35d9b9844ce3020f..01cacb1c9a03d40d27b777ecc31213f9972092e4 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSessionTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testSessionTool</string> </value>
@@ -43,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 70,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -55,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -74,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -83,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.py
index 359410f7718ca03548f6f4b20bc3c9c7a503b306..9823b443da945ecb5796b01e9e681543559b978d 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.py
@@ -75,4 +75,4 @@ class TestTimeout(ERP5TypeTestCase):
     with Deadline(1.0):
       time.sleep(2)
       with self.assertRaises(TimeoutReachedError):
-        [x.getObject() for x in self.portal.portal_templates.searchFolder()]
+        _ = [x.getObject() for x in self.portal.portal_templates.searchFolder()]
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.xml
index 1c9448e76bebbc170cb63ef2051f5f072da85154..56beb36abfd389c0f5bd2cc8ee858b05c945fae0 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimeout.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testTimeout</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testTimeout</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testTimeout</string> </value>
@@ -37,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 78,  8: Expression "[x.getObject() for x in self.portal.portal_templates.searchFolder()]" is assigned to nothing (expression-not-assigned)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -49,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -68,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -77,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.py
index cd9ab656dcf3ff3cd6c208033222abadb16b6543..34650038ec5fc26ef083f40f260e9e88f1d3988a 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.py
@@ -26,14 +26,12 @@
 #
 ##############################################################################
 
-import unittest
-
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-from AccessControl.SecurityManagement import newSecurityManager, \
-                                             noSecurityManager
+from AccessControl.SecurityManagement import noSecurityManager
 from AccessControl.ZopeGuards import guarded_apply, guarded_getattr
 from zExceptions import Unauthorized
 
+
 class TestTimerService(ERP5TypeTestCase):
   """
   Test TimerService-related features. Maybe this should be put in TimerService
@@ -41,20 +39,6 @@ class TestTimerService(ERP5TypeTestCase):
   idea to put an ERP5-type test in it.
   """
 
-  def getTitle(self):
-    return "TimerService"
-
-  def getBusinessTemplateList(self):
-    """
-    """
-    return ()
-
-  def afterSetUp(self):
-    uf = self.portal.acl_users
-    uf._doAddUser('rc', '', ['Manager'], [])
-    user = uf.getUserById('rc').__of__(uf)
-    newSecurityManager(None, user)
-
   def test_01_checkAnonymousProcessing(self):
     """
       Test whether a timer can be invoked by anonymous.
@@ -63,14 +47,9 @@ class TestTimerService(ERP5TypeTestCase):
     timer_service = self.app.Control_Panel.timer_service
     process_timer = guarded_getattr(timer_service, 'process_timer')
     try:
-        guarded_apply(process_timer, (0,))
+      guarded_apply(process_timer, (0,))
     except Unauthorized:
-        self.fail('calling process_timer is unauthorized')
-    except:
-        # Do not care about any exception but unauthorized.
-        pass
-
-def test_suite():
-  suite = unittest.TestSuite()
-  suite.addTest(unittest.makeSuite(TestTimerService))
-  return suite
+      self.fail('calling process_timer is unauthorized')
+    except Exception:
+      # Do not care about any exception but unauthorized.
+      pass
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.xml
index 72008e33db6c2444c5ab494c844be2b18f86b104..d4ead95f625256a4e3df13adbc06e1b988903467 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTimerService.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testTimerService</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testTimerService</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testTimerService</string> </value>
@@ -37,12 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 66,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W: 68,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W: 71,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W: 69,  4: No exception type(s) specified (bare-except)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -52,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -71,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -80,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.py
index 0e2fed6db09148f717957369154c5dccdda873e3..e685742c6c1744a506c5852f6d617709a56974b0 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.py
@@ -31,74 +31,74 @@ from Products.ERP5Type.TransactionalVariable import getTransactionalVariable
 
 class TestTransactionalVariable(TestCase):
 
-    from transaction import abort, commit
+  from transaction import abort, commit
 
-    def test_01_DictInterface(self):
-      """Check if a transaction variable behaves in the same way as a dict.  """
+  def test_01_DictInterface(self):
+    """Check if a transaction variable behaves in the same way as a dict.  """
 
-      tv = getTransactionalVariable()
+    tv = getTransactionalVariable()
 
-      # Test frequently used dict methods. This does not cover everything,
-      # but should be enough.
-      tv.clear()
-      self.assertEqual(len(tv), 0)
-      with self.assertRaises(KeyError):
-        tv['toto']
+    # Test frequently used dict methods. This does not cover everything,
+    # but should be enough.
+    tv.clear()
+    self.assertEqual(len(tv), 0)
+    with self.assertRaises(KeyError):
+      _ = tv['toto']
 
-      tv['toto'] = 'titi'
-      self.assertEqual(len(tv), 1)
-      self.assertEqual(tv['toto'], 'titi')
+    tv['toto'] = 'titi'
+    self.assertEqual(len(tv), 1)
+    self.assertEqual(tv['toto'], 'titi')
 
-      self.assertIsNone(tv.get('foo'))
-      tv.setdefault('foo', 'bar')
-      self.assertEqual(len(tv), 2)
-      self.assertEqual(tv['foo'], 'bar')
+    self.assertIsNone(tv.get('foo'))
+    tv.setdefault('foo', 'bar')
+    self.assertEqual(len(tv), 2)
+    self.assertEqual(tv['foo'], 'bar')
 
-      self.assertIn('foo', tv)
-      del tv['foo']
-      self.assertNotIn('foo', tv)
-      self.assertEqual(len(tv), 1)
+    self.assertIn('foo', tv)
+    del tv['foo']
+    self.assertNotIn('foo', tv)
+    self.assertEqual(len(tv), 1)
 
-    def test_02_Expiration(self):
-      """Check if a transaction variable does not persist over multiple
-      transactions.
-      """
-      tv = getTransactionalVariable()
-      tv.clear()
-      self.assertEqual(len(tv), 0)
+  def test_02_Expiration(self):
+    """Check if a transaction variable does not persist over multiple
+    transactions.
+    """
+    tv = getTransactionalVariable()
+    tv.clear()
+    self.assertEqual(len(tv), 0)
 
-      # Commit and check.
-      tv['toto'] = 'titi'
-      self.assertEqual(tv['toto'], 'titi')
-      self.commit()
-      self.assertNotIn('toto', tv)
+    # Commit and check.
+    tv['toto'] = 'titi'
+    self.assertEqual(tv['toto'], 'titi')
+    self.commit()
+    self.assertNotIn('toto', tv)
 
-      # Abort and check.
-      tv['toto'] = 'titi'
-      self.assertEqual(tv['toto'], 'titi')
-      self.abort()
-      self.assertNotIn('toto', tv)
+    # Abort and check.
+    tv['toto'] = 'titi'
+    self.assertEqual(tv['toto'], 'titi')
+    self.abort()
+    self.assertNotIn('toto', tv)
 
-    def test_03_Durability(self):
-      """Check if a transaction variable does not disappear within the same
-      transaction.
-      """
-      tv = getTransactionalVariable()
-      tv.clear()
-      self.assertEqual(len(tv), 0)
+  def test_03_Durability(self):
+    """Check if a transaction variable does not disappear within the same
+    transaction.
+    """
+    tv = getTransactionalVariable()
+    tv.clear()
+    self.assertEqual(len(tv), 0)
 
-      # Set both a transaction variable and a volatile attribute,
-      # in order to detect the difference between their behaviors.
-      tv['toto'] = 'titi'
-      self.assertEqual(tv['toto'], 'titi')
-      app = self.app
-      vattr = '_v_erp5type_test_durability'
-      setattr(app, vattr, 'dummy')
-      self.assertEqual(getattr(app, vattr), 'dummy')
+    # Set both a transaction variable and a volatile attribute,
+    # in order to detect the difference between their behaviors.
+    tv['toto'] = 'titi'
+    self.assertEqual(tv['toto'], 'titi')
+    app = self.app
+    vattr = '_v_erp5type_test_durability'
+    setattr(app, vattr, 'dummy')
+    self.assertEqual(getattr(app, vattr), 'dummy')
 
-      # Force to minimize the connection cache so that volatile attributes
-      # and unghostified objects are discarded.
-      app._p_jar.cacheMinimize()
-      self.assertIn('toto', tv)
-      self.assertEqual(tv['toto'], 'titi')
-      self.assertIsNone(getattr(app, vattr, None))
+    # Force to minimize the connection cache so that volatile attributes
+    # and unghostified objects are discarded.
+    app._p_jar.cacheMinimize()
+    self.assertIn('toto', tv)
+    self.assertEqual(tv['toto'], 'titi')
+    self.assertIsNone(getattr(app, vattr, None))
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.xml
index 5c3cfdbde3bde503cca15aee8c31ac58b2ca4fb9..997e2e14ae2c4efe3b2688b84d5a471f172bb9a8 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTransactionalVariable.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testTransactionalVariable</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5Type.tests.testTransactionalVariable</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testTransactionalVariable</string> </value>
@@ -37,56 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 34,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 36,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 37,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 39,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 43,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 44,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 45,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 46,  0: Bad indentation. Found 8 spaces, expected 6 (bad-indentation)</string>
-                <string>W: 48,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 49,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 50,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 52,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 53,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 54,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 55,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 57,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 58,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 59,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 60,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 62,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 63,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 66,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 67,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 68,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 71,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 72,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 73,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 74,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 77,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 78,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 79,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 80,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 82,  0: Bad indentation. Found 4 spaces, expected 2 (bad-indentation)</string>
-                <string>W: 83,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 86,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 87,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 88,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 92,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 93,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 94,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 95,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 96,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 97,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:101,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:102,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:103,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W:104,  0: Bad indentation. Found 6 spaces, expected 4 (bad-indentation)</string>
-                <string>W: 46,  8: Statement seems to have no effect (pointless-statement)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -96,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -115,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -124,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.py
index 45ad601d462ae6081cb397ce68917a67dff1be6c..17ca218496bf6788b2f5d2799821bb4d3b8742be 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.py
@@ -53,13 +53,8 @@ class TestTrashTool(ERP5TypeTestCase):
     return 1
 
   def afterSetUp(self):
-    self.login()
-    portal = self.getPortal()
-    catalog_tool = self.getCatalogTool()
-
-  def login(self):
-    uf = self.getPortal().acl_users
-    uf._doAddUser('seb', '', ['Manager'], [])
+    uf = self.portal.acl_users
+    uf._doAddUser('seb', self.newPassword(), ['Manager'], [])
     user = uf.getUserById('seb').__of__(uf)
     newSecurityManager(None, user)
 
@@ -81,9 +76,8 @@ class TestTrashTool(ERP5TypeTestCase):
     base_category = pc._getOb(bc_id, None)
     self.assertTrue(base_category is not None)
     category_list = []
-    for i in xrange(10):
+    for _ in xrange(10):
       category = base_category.newContent(portal_type='Category')
-      self.assertTrue(category is not None)
       category_list.append(category.getId())
     sequence.edit(category_id_list=category_list)
 
@@ -95,13 +89,13 @@ class TestTrashTool(ERP5TypeTestCase):
     erp5_core = ps['erp5_core']
     erp5_core.manage_addFolder(id="image")
     image = erp5_core._getOb("image")
-    f = image.manage_addFile(id="file")
+    image.manage_addFile(id="file")
 
   def stepCheckTrashToolExists(self, sequence=None, sequence_list=None, **kw):
     """
     Check existence of trash tool
     """
-    self.assertTrue(self.getTrashTool() is not None)
+    self.assertIsNotNone(self.getTrashTool())
 
   def stepCreateTrashBin(self, sequence=None, sequence_list=None, **kw):
     """
@@ -193,11 +187,10 @@ class TestTrashTool(ERP5TypeTestCase):
     trash_id = sequence.get('trash_id')
     trash = self.getTrashTool()
     trashbin = trash._getOb(trash_id, None)
-    self.assertTrue(trashbin is not None)
+    self.assertIsNotNone(trashbin)
     # get category trash folder
     bc_id = sequence.get('bc_id')
     trashbin_objects_list = list(trashbin.objectValues())
-    self.assertTrue(len(trashbin_objects_list) > 0)
     self.assertEqual(len(trashbin_objects_list), 1)
     obj = trashbin_objects_list[0]
     self.assertEqual(obj.getId(), 'portal_categories_items')
@@ -215,11 +208,10 @@ class TestTrashTool(ERP5TypeTestCase):
     subcat_objects_list = (cat_object.objectIds())
     self.assertNotEqual(len(subcat_objects_list), 0)
     categ_id_list = sequence.get('category_id_list')
-    for id in subcat_objects_list:
-      self.assertTrue(id in categ_id_list)
-      cat = cat_object._getOb(id, None)
-      self.assertTrue(cat is not None)
-      self.assertTrue(cat.isIndexable, 0)
+    for id_ in subcat_objects_list:
+      self.assertIn(id_, categ_id_list)
+      cat = cat_object._getOb(id_, None)
+      self.assertTrue(cat.isIndexable)
       self.assertEqual(cat.getPortalType(), 'Category')
 
   def stepCheckFolderObjectBackup(self, sequence=None, sequence_list=None, **kw):
@@ -230,7 +222,6 @@ class TestTrashTool(ERP5TypeTestCase):
     trash = self.getTrashTool()
     trashbin = trash._getOb(trash_id, None)
     self.assertTrue(trashbin is not None)
-    bc_id = sequence.get('bc_id')
     trashbin_objects_list = list(trashbin.objectValues())
     self.assertTrue(len(trashbin_objects_list) > 0)
     self.assertEqual(len(trashbin_objects_list), 1)
@@ -318,8 +309,6 @@ class TestTrashTool(ERP5TypeTestCase):
     bc_id = sequence.get('bc_id')
     pc = self.getCategoryTool()
     base_category = pc._getOb(bc_id, None)
-    self.assertTrue(base_category is not None)
-    subobjects_ids = base_category.objectIds()
     bc_path = base_category.getPath().split('/')[2:-1]
     # check backup
     backup_subobjects_ids = trash.backupObject(trashbin, bc_path, bc_id, save=1, keep_subobjects=1)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.xml
index e5e66d2ffe27ac85b605ce6c2f7bdfa882af660b..badad026f4e6fec9ebfb2fef73df862a73c12cd4 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testTrashTool.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testTrashTool</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testTrashTool</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testTrashTool</string> </value>
@@ -37,16 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 57,  4: Unused variable \'portal\' (unused-variable)</string>
-                <string>W: 58,  4: Unused variable \'catalog_tool\' (unused-variable)</string>
-                <string>W: 60,  2: Arguments number differs from overridden \'login\' method (arguments-differ)</string>
-                <string>W: 84,  8: Unused variable \'i\' (unused-variable)</string>
-                <string>W: 98,  4: Unused variable \'f\' (unused-variable)</string>
-                <string>W:218,  8: Redefining built-in \'id\' (redefined-builtin)</string>
-                <string>W:233,  4: Unused variable \'bc_id\' (unused-variable)</string>
-                <string>W:322,  4: Unused variable \'subobjects_ids\' (unused-variable)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -56,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -75,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -84,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.py
index 66559ab589bfbb3a3812f09bc288f91678fdc325..f5a9b161c928106d0ccdefbf6c13c6ab8ad04f7d 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.py
@@ -94,7 +94,7 @@ class TestWorkflowHistoryList(TestCase):
           a = EXPECTED[item]
         except IndexError:
           with self.assertRaises(IndexError):
-            ddl[item]
+            _ = ddl[item]
         else:
           assert a != [], a
           self.assertEqual(a, ddl[item])
@@ -102,16 +102,16 @@ class TestWorkflowHistoryList(TestCase):
 
     i = COUNT + 1
     for i in xrange(-i, i):
-      check[i]
-    check[-50:10]
-    check[:20:3]
-    check[5:40]
-    check[32::4]
-    check[::-1]
-    check[-5::-7]
-    check[50:40:-1]
-    check[30:-50:-4]
-    check[:30:-3]
+      _ = check[i]
+    _ = check[-50:10]
+    _ = check[:20:3]
+    _ = check[5:40]
+    _ = check[32::4]
+    _ = check[::-1]
+    _ = check[-5::-7]
+    _ = check[50:40:-1]
+    _ = check[30:-50:-4]
+    _ = check[:30:-3]
 
     self.assertFalse(ddl[-5:30])
     self.assertFalse(ddl[30:-5:-1])
@@ -129,8 +129,7 @@ class TestWorkflowHistoryList(TestCase):
 
   @fixed_count_bucket
   def test_01_DoublyLinkList(self):
-    EXPECTED = range(COUNT)
-    self.checkList(new(DoublyLinkList, EXPECTED))
+    self.checkList(new(DoublyLinkList, range(COUNT)))
 
   @fixed_count_bucket
   def test_02_LegacyWorkflowHistoryList(self):
@@ -205,10 +204,10 @@ class TestDedup(ERP5TypeTestCase):
     self.login()
     deduped = []
     def dedupStrings(obj):
-      new = orig_dedupStrings(obj)
-      self.assertEqual(new, obj)
-      deduped.append(len(new))
-      return new
+      new_obj = orig_dedupStrings(obj)
+      self.assertEqual(new_obj, obj)
+      deduped.append(len(new_obj))
+      return new_obj
     from Products.ERP5Type import Workflow
     orig_dedupStrings = Workflow.dedupStrings
     try:
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.xml
index 0d88bf346248c2a10e591352aa91f31e6cd37d92..2f45ef51b3a273b86e0b46ee44924f481c97d4ab 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowHistoryList.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testWorkflowHistoryList</string> </value>
@@ -43,21 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 97, 12: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:105,  6: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:106,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:107,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:108,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:109,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:110,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:111,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:112,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:113,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:114,  4: Statement seems to have no effect (pointless-statement)</string>
-                <string>W:132,  4: Redefining name \'EXPECTED\' from outer scope (line 76) (redefined-outer-name)</string>
-                <string>W:206,  6: Redefining name \'new\' from outer scope (line 55) (redefined-outer-name)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -67,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -86,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -95,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.py
index efbcc2b241a6190e114eff73ef21a94c9977174a..c89ee988ea5a187d84c2bf01601f49f47e46b489 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.py
@@ -78,7 +78,7 @@ class TestXMLPickle(unittest.TestCase):
     reconstructed_obj = pickle.loads(reconstructed_pickled_data)
 
     self.assert_(reconstructed_obj.__class__ is DummyClass)
-    self.assert_(type(getattr(reconstructed_obj, 'data', None)) is list)
+    self.assert_(type(getattr(reconstructed_obj, 'data', None)) is list)  # pylint:disable=unidiomatic-typecheck
     self.assertEqual(reconstructed_obj.data[0], 1)
     self.assert_(reconstructed_obj.data[1] is reconstructed_obj)
     self.assert_(reconstructed_obj.data[2] is reconstructed_obj.data)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.xml
index bd4c2f93a1a225f3c62a1f426938868353927c50..8cfaea2f1c4707269a982a408b3e704093d10dda 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testXMLPickle.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testXMLPickle</string> </value>
@@ -43,9 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 81, 17: Using type() instead of isinstance() for a typecheck. (unidiomatic-typecheck)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -55,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -74,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -83,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.py
index 77e9c6ed4f80594c7fc6e3bfeba36882b0bb1c9d..4818956ebe3239e81878ee82aa2cf044ca312f99 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.py
@@ -58,7 +58,7 @@ class TestZODBHistory(ERP5TypeTestCase):
       preference = preference_tool.newContent(id="zodb_history_test_preference",
                                               portal_type="Preference")
     if preference.getPreferenceState() != "enabled":
-       preference.enable()
+      preference.enable()
 
   def addOrganisation(self, organisation_id):
     """ Add an organisation """
@@ -69,19 +69,9 @@ class TestZODBHistory(ERP5TypeTestCase):
 
   def setUpUser(self):
     """ Set up a user to test normal users can use this function. """
-    self.addUser('tatuya')
-
-  def addUser(self, user_name, role=['Member', 'Owner', 'Assignor']):
-    """ Create a test user."""
     uf = self.portal.acl_users
-    if not uf.getUserById(user_name):
-      uf._doAddUser(user_name, '', role, [])
-
-  def _clearCache(self):
-    """ Clear cache to validate the preference modification. """
-    self.portal.portal_caches.clearCache(
-      cache_factory_list=('erp5_ui_short', # for preference cache
-                          ))
+    if not uf.getUserById('tatuya'):
+      uf._doAddUser('tatuya', '', ['Member', 'Owner', 'Assignor'], [])
 
   def test_01_testZODBHistory(self):
     """
@@ -116,7 +106,6 @@ class TestZODBHistory(ERP5TypeTestCase):
 
     # changes the limit to 100
     preference.setPreferredHtmlStyleZodbHistorySize(100)
-    self._clearCache()
     self.assertEqual(preference.getPreferredHtmlStyleZodbHistorySize(), 100)
     history_list = org2.Base_getZODBHistoryList()
     # Now that the limit is 100, thus the history page show the all history
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.xml
index e8e8049778b52903f1d4aa2552e9acac5eba933e..5f7253eb670e07ed821cc1838ebb2ed6dcb01eac 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.xml
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testZODBHistory.xml
@@ -6,6 +6,12 @@
     </pickle>
     <pickle>
       <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>testZODBHistory</string> </value>
@@ -14,6 +20,12 @@
             <key> <string>default_source_reference</string> </key>
             <value> <string>Products.ERP5.tests.testZODBHistory</string> </value>
         </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>id</string> </key>
             <value> <string>test.erp5.testZODBHistory</string> </value>
@@ -37,10 +49,7 @@
         <item>
             <key> <string>text_content_warning_message</string> </key>
             <value>
-              <tuple>
-                <string>W: 61,  0: Bad indentation. Found 7 spaces, expected 6 (bad-indentation)</string>
-                <string>W: 74,  2: Dangerous default value [] as argument (dangerous-default-value)</string>
-              </tuple>
+              <tuple/>
             </value>
         </item>
         <item>
@@ -50,13 +59,28 @@
         <item>
             <key> <string>workflow_history</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
   <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
     <pickle>
       <global name="PersistentMapping" module="Persistence.mapping"/>
     </pickle>
@@ -69,7 +93,7 @@
                 <item>
                     <key> <string>component_validation_workflow</string> </key>
                     <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
                     </value>
                 </item>
               </dictionary>
@@ -78,7 +102,7 @@
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
     </pickle>
diff --git a/bt5/erp5_core_test/bt/skip_coding_style_test b/bt5/erp5_core_test/bt/skip_coding_style_test
deleted file mode 100644
index 56a6051ca2b02b04ef92d5150c9ef600403cb1de..0000000000000000000000000000000000000000
--- a/bt5/erp5_core_test/bt/skip_coding_style_test
+++ /dev/null
@@ -1 +0,0 @@
-1
\ No newline at end of file
diff --git a/bt5/erp5_core_test/bt/template_test_id_list b/bt5/erp5_core_test/bt/template_test_id_list
index 7b9492fdbc682a4c174081a325394783600b8d48..678a49e9e0f6fa29cbfce3b65c8d7b866a3ec8a7 100644
--- a/bt5/erp5_core_test/bt/template_test_id_list
+++ b/bt5/erp5_core_test/bt/template_test_id_list
@@ -48,7 +48,6 @@ test.erp5.testQueryModule
 test.erp5.testRestrictedPythonSecurity
 test.erp5.testSelectionTool
 test.erp5.testSessionTool
-test.erp5.testSQLCachedWorklist
 test.erp5.testTimeout
 test.erp5.testTimerService
 test.erp5.testTransactionalVariable