diff --git a/product/ERP5/Document/BusinessTemplate.py b/product/ERP5/Document/BusinessTemplate.py
index 23617b1a5a862b56735439d80e5dcc5292e95e02..11d8e4bcd805bfb9a76e4039fc777e054fc42353 100755
--- a/product/ERP5/Document/BusinessTemplate.py
+++ b/product/ERP5/Document/BusinessTemplate.py
@@ -280,7 +280,6 @@ class BaseTemplateItem(Implicit, Persistent):
           modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]})
     return modified_object_list
 
-
   def install(self, context, trashbin, **kw):
     pass
 
@@ -447,6 +446,15 @@ class ObjectTemplateItem(BaseTemplateItem):
       Backup the object in portal trash if necessery and return its subobjects
     """
     subobjects_dict = {}
+    if trashbin is None: #m ust return subobjects
+      object_path = container_path + [object_id]
+      obj = self.unrestrictedTraverse(object_path)
+      for subobject_id in list(obj.objectIds()):
+        subobject_path = object_path + [subobject_id]
+        subobject = self.unrestrictedTraverse(subobject_path)
+        subobject_copy = subobject._p_jar.exportFile(subobject._p_oid)
+        subobjects_dict[subobject_id] = subobject_copy      
+      return subobjects_dict
     # XXX btsave is for backward compatibility
     if action == 'backup' or action == 'btsave':
       subobjects_dict = self.portal_trash.backupObject(trashbin, container_path, object_id, save=1)
@@ -568,7 +576,7 @@ class ObjectTemplateItem(BaseTemplateItem):
       object_id = relative_url.split('/')[-1]
       try:        
         container = portal.unrestrictedTraverse(container_path)
-        if trash:
+        if trash and trashbin is not None:
           self.portal_trash.backupObject(trashbin, container_path, object_id, save=1, keep_subobjects=1)
         container.manage_delObjects([object_id])
       except (NotFound, KeyError):
@@ -576,38 +584,6 @@ class ObjectTemplateItem(BaseTemplateItem):
         pass
     BaseTemplateItem.uninstall(self, context, **kw)
 
-  def _compareObjects(self, object1, object2, btsave_object_included=0):
-    """
-      Execute a diff between 2 objects,
-      and return a string diff.
-    """
-    xml_dict = {
-      str(object1): None,
-      str(object2): None,
-    }
-    # Generate XML
-    for obj in (object1, object2):
-      string_io = StringIO()
-      XMLExportImport.exportXML(obj._p_jar, obj._p_oid, string_io)
-      object_xml = string_io.getvalue()
-      string_io.close()
-      object_xml_lines = object_xml.splitlines(1)
-      xml_dict[str(obj)] = object_xml_lines
-    # Make diff between XML
-    diff_instance = difflib.Differ()
-    diff_list = list(diff_instance.compare(xml_dict[str(object1)],
-                                           xml_dict[str(object2)]))
-    diff_list = [x for x in diff_list if x[0] != ' ']
-#     # Dirty patch to remove useless diff message (id different)
-#     if btsave_object_included==1:
-#       if len(diff_list) == 3:
-#         if '_btsave_' in diff_list[1]:
-#           diff_list = []
-    # Return string
-    result = '%s' % ''.join(diff_list)
-    return result
-
-
 class PathTemplateItem(ObjectTemplateItem):
   """
     This class is used to store objects with wildcards supported.
@@ -795,12 +771,29 @@ class CategoryTemplateItem(ObjectTemplateItem):
           container = category_tool.unrestrictedTraverse(container_path)
           container_ids = container.objectIds()
           if category_id in container_ids:    # Object already exists
-            subobjects_dict = self.portal_trash.backupObject(trashbin, container_path, category_id, save=1)
+            # XXX call backup here
+            subobjects_dict = self._backupObject('backup', trashbin, container_path, category_id)
             container.manage_delObjects([category_id])
           category = container.newContent(portal_type=obj.getPortalType(), id=category_id)
           for property in obj.propertyIds():
             if property not in ('id', 'uid'):
               category.setProperty(property, obj.getProperty(property, evaluate=0))
+          # import sub objects if there is
+          if len(subobjects_dict) > 0:
+            # get a jar
+            connection = obj._p_jar
+            o = category
+            while connection is None:
+              o = o.aq_parent
+              connection = o._p_jar
+            # import subobjects
+            for subobject_id in subobjects_dict.keys():
+              subobject_data = subobjects_dict[subobject_id]
+              subobject_data.seek(0)
+              subobject = connection.importFile(subobject_data)
+              if subobject_id not in category.objectIds():
+                category._setObject(subobject_id, subobject)
+
 
 class SkinTemplateItem(ObjectTemplateItem):
 
@@ -1738,7 +1731,7 @@ class ModuleTemplateItem(BaseTemplateItem):
     for id in keys:
       if id in id_list:
         try:
-          if trash:
+          if trash and trashbin is not None:
             container_path = id.split('/')
             self.portal_trash.backupObject(trashbin, container_path, id, save=1, keep_subobjects=1)
           p.manage_delObjects([id])
@@ -2670,11 +2663,11 @@ Business Template is a set of definitions, such as skins, portal types and categ
         if len(object_to_update) == 0:
           # nothing to be done
           return
-        
+      trash_tool = getToolByName(self, 'portal_trash', None)
       # always created a trash bin because we may to save object already present
       # but not in a previous business templates apart at creation of a new site
-      if len(object_to_update) > 0 or len(self.portal_templates.objectIds()) > 1:
-        trashbin = self.portal_trash.newTrashBin(self.getTitle(), self)
+      if trash_tool is not None and len(object_to_update) > 0 or len(self.portal_templates.objectIds()) > 1:
+        trashbin = trash_tool.newTrashBin(self.getTitle(), self)
       else:
         trashbin = None