diff --git a/product/ERP5Type/ZopePatch.py b/product/ERP5Type/ZopePatch.py
index b9b4d4c0aa5785a497ea714ab364013f598d2b08..31947d5162fddf14d8c9f411151bce0195b22271 100755
--- a/product/ERP5Type/ZopePatch.py
+++ b/product/ERP5Type/ZopePatch.py
@@ -24,7 +24,7 @@
 ##############################################################################
 
 
-from zLOG import LOG
+from zLOG import LOG, INFO, ERROR, WARNING
 from string import join
 from DateTime import DateTime
 
@@ -38,7 +38,7 @@ MembershipTool.membersfolder_id = 'member'
 from OFS.ObjectManager import ObjectManager, customImporters
 class PatchedObjectManager(ObjectManager):
     def _importObjectFromFile(self, filepath, verify=1, set_owner=1, id=None):
-        LOG('_importObjectFromFile, filepath',0,filepath)
+        #LOG('_importObjectFromFile, filepath',0,filepath)
         # locate a valid connection
         connection=self._p_jar
         obj=self
@@ -194,7 +194,7 @@ class ERP5PropertyManager(PropertyManager):
       the given id, type, and value."""
       if type_converters.has_key(type):
           value=type_converters[type](value)
-      LOG('manage_addProperty', 0, 'id = %r, value = %r, type = %r, REQUEST = %r' % (id, value, type, REQUEST))
+      #LOG('manage_addProperty', 0, 'id = %r, value = %r, type = %r, REQUEST = %r' % (id, value, type, REQUEST))
       self._setProperty(id.strip(), value, type)
       if REQUEST is not None:
           return self.manage_propertiesForm(self, REQUEST)
@@ -427,7 +427,6 @@ from BTrees.OOBTree import OOBTree
 from BTrees.OIBTree import OIBTree, union
 from BTrees.Length import Length
 from OFS.ObjectManager import BadRequestException, BeforeDeleteException
-from zLOG import LOG, INFO, ERROR, WARNING
 from Products.ZCatalog.Lazy import LazyMap
 
 class ERP5BTreeFolder2Base (BTreeFolder2Base):
@@ -973,6 +972,8 @@ def reorderPickle(jar, p):
 def PatchedXMLrecord(oid, plen, p, id_mapping):
     # Proceed as usual
     q=ppml.ToXMLUnpickler
+    
+    # Do it onces
     f=StringIO(p)
     u=q(f)
     id=ppml.u64(oid)
@@ -982,6 +983,21 @@ def PatchedXMLrecord(oid, plen, p, id_mapping):
     id_mapping.setConvertedAka(old_aka, aka)
     u.idprefix=str(id)+'.'
     p=u.load(id_mapping=id_mapping).__str__(4)
+    
+    # Reset mapping
+    id_mapping.resetMapping()
+    
+    # Do it again
+    f=StringIO(p)
+    u=q(f)
+    id=ppml.u64(oid)
+    id = id_mapping[id]
+    old_aka = encodestring(oid)[:-1]
+    aka=encodestring(ppml.p64(long(id)))[:-1]  # Rebuild oid based on mapped id
+    id_mapping.setConvertedAka(old_aka, aka)
+    u.idprefix=str(id)+'.'
+    p=u.load(id_mapping=id_mapping).__str__(4)
+    
     if f.tell() < plen:
         p=p+u.load(id_mapping=id_mapping).__str__(4)
     String='  <record id="%s" aka="%s">\n%s  </record>\n' % (id, aka, p)
@@ -1026,14 +1042,24 @@ class Scalar:
 
     def __str__(self, indent=0):
         id = ''
-        if hasattr(self, 'id'):
-            if self.mapping.isMarked(self.id): id=' id="%s"' % self.mapping[self.id]
         name=string.lower(self.__class__.__name__)
-        return '%s<%s%s>%s</%s>\n' % (
+        result = '%s<%s%s>%s</%s>\n' % (
             ' '*indent, name, id, self.value(), name)
+        if hasattr(self, 'id'):
+            # The value is Immutable - let us add it the the immutable mapping
+            # to reduce the number of unreadable references
+            self.mapping.setImmutable(self.id, Immutable(value = result))
+        return result            
 
 ppml.Scalar = Scalar
 
+class Immutable:
+    def __init__(self, value):
+        self.value = value
+        
+    def getValue(self):
+        return self.value        
+
 class String(Scalar):
     def __init__(self, v, mapping, encoding=''):
         encoding, v = convert(v)
@@ -1050,16 +1076,19 @@ class String(Scalar):
                 # Make sure we never produce this kind of xml output
                 raise
         id = ''
-        if hasattr(self, 'id'):
-            if self.mapping.isMarked(self.id): id=' id="%s"' % self.mapping[self.id]
         encoding=''
         if hasattr(self, 'encoding'):
             if self.encoding != 'repr':
                 # JPS repr is default encoding
                 encoding=' encoding="%s"' % self.encoding
         name=string.lower(self.__class__.__name__)
-        return '%s<%s%s%s>%s</%s>\n' % (
+        result = '%s<%s%s%s>%s</%s>\n' % (
             ' '*indent, name, id, encoding, v, name)
+        if hasattr(self, 'id'):
+            # The value is Immutable - let us add it the the immutable mapping
+            # to reduce the number of unreadable references
+            self.mapping.setImmutable(self.id, Immutable(value = result))
+        return result            
 
 ppml.String = String
 
@@ -1182,7 +1211,11 @@ class Reference(Scalar):
         self.mapping = mapping
     def __str__(self, indent=0):
         v=self._v
-        name=string.lower(self.__class__.__name__)
+        name=string.lower(self.__class__.__name__)        
+        #LOG('Reference', 0, str(v))
+        if self.mapping.hasImmutable(v):
+          return self.mapping.getImmutable(v).getValue()        
+        LOG('noImmutable', 0, "%s mapped to %s" % (v, self.mapping[v]))                  
         self.mapping.mark(v)
         return '%s<%s id="%s"/>\n' % (' '*indent,name,self.mapping[v])
 
@@ -1200,6 +1233,13 @@ class Object(Sequence):
 ppml.Object = Object
 
 class IdentityMapping:
+    
+    def __init__(self):
+      self.immutable = {}
+    
+    def resetMapping():
+      pass
+    
     def __getitem__(self, id):
       return id
 
@@ -1215,6 +1255,16 @@ class IdentityMapping:
     def isMarked(self, v):
       return 1
 
+    def setImmutable(self, k, v):
+      self.immutable[k] = v
+
+    def getImmutable(self, k):
+      return self.immutable[k]
+
+    def hasImmutable(self, k):
+      return self.immutable.has_key(k)
+
+      
 ppml.IdentityMapping = IdentityMapping
 
 class MinimalMapping(IdentityMapping):
@@ -1225,7 +1275,16 @@ class MinimalMapping(IdentityMapping):
       self.last_id = 1
       self.converted_aka = {}
       self.marked_reference = {}
+      self.immutable = {}
 
+    def resetMapping():
+      self.mapped_id = {}
+      self.mapped_core_id = {}
+      self.last_sub_id = {}
+      self.last_id = 1
+      self.converted_aka = {}
+      self.marked_reference = {}
+              
     def __getitem__(self, id):
       id = str(id)
       split_id = id.split('.')
@@ -1372,8 +1431,8 @@ class ToXMLUnpickler(Unpickler):
 
     def load_tuple(self):
         k = self.marker()
-        LOG('load_tuple, k',0,k)
-        LOG('load_tuple, stack[k+1:]',0,self.stack[k+1:])
+        #LOG('load_tuple, k',0,k)
+        #LOG('load_tuple, stack[k+1:]',0,self.stack[k+1:])
         self.stack[k:] = [Tuple(self.id_mapping, v=self.stack[k+1:])]
     dispatch[TUPLE] = load_tuple
 
@@ -1465,7 +1524,6 @@ class ToXMLUnpickler(Unpickler):
 
     def load_binput(self):
         i = mloads('i' + self.read(1) + '\000\000\000')
-        #from zLOG import LOG
         #LOG('load_binput', 0, 'self.stack = %r, self.idprefix+`i` = %r' % (self.stack, self.idprefix+`i`))
         self.stack[-1].id=self.idprefix+`i`
     dispatch[BINPUT] = load_binput
@@ -1479,9 +1537,8 @@ class ToXMLUnpickler(Unpickler):
       def __init__(self, func):
         self.func = func
 
-      def __call__(self, context):
-        from zLOG import LOG
-        LOG('LogCall', 0, 'self.stack = %r, func = %s' % (context.stack, self.func.__name__))
+      def __call__(self, context):        
+        #LOG('LogCall', 0, 'self.stack = %r, func = %s' % (context.stack, self.func.__name__))
         return self.func(context)
 
     #for code in dispatch.keys():