diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py
index 243079d317be907a71feb72f3f44c11d940ed850..f51d24aef90069fe3808d81638b3f0ffe86201d0 100644
--- a/product/ERP5Type/Base.py
+++ b/product/ERP5Type/Base.py
@@ -885,7 +885,7 @@ class Base( CopyContainer,
         accessor = property_holder.createAccessor(id)
       return accessor
     except KeyError:
-      pass
+      property_holder = None
 
     if id in ('portal_types', 'portal_url', 'portal_workflow'):
       # This is required to precent infinite loop (we need to access portal_types tool)
@@ -942,12 +942,12 @@ class Base( CopyContainer,
           for bid in base_category_list:
             if bid not in generated_bid:
               #LOG( "Create createRelatedValueAccessors %s" % bid,0,'')
-              createRelatedValueAccessors(bid)
+              createRelatedValueAccessors(property_holder, bid)
               generated_bid[bid] = 1
       for ptype in portal_types.objectValues('ERP5 Type Information') :
         for bid in ptype.base_category_list :
           if bid not in generated_bid :
-            createRelatedValueAccessors(bid)
+            createRelatedValueAccessors(property_holder, bid)
             generated_bid[bid] = 1
 
       Base.aq_related_generated = 1
diff --git a/product/ERP5Type/Utils.py b/product/ERP5Type/Utils.py
index 48e6ba1e687507a61a992df91f7a90b43d4038e8..78cb2dc53b28e31ce30e3ebf8e320511b56abb79 100644
--- a/product/ERP5Type/Utils.py
+++ b/product/ERP5Type/Utils.py
@@ -1400,8 +1400,7 @@ def setDefaultProperties(property_holder, object=None, portal=None):
           read_permission = Permissions.AccessContentsInformation
           write_permission = Permissions.ModifyPortalContent
         # Actualy create accessors
-        createRelatedValueAccessors(cat, read_permission=read_permission,
-                                         write_permission=write_permission)
+        createRelatedValueAccessors(property_holder, cat, read_permission=read_permission)
       # Unnecessary to create these accessors more than once.
       base_category_dict.clear()
     # Create the constraint method list - always check type
@@ -1437,7 +1436,7 @@ def setDefaultProperties(property_holder, object=None, portal=None):
     # allows to create the equivalent of NULL values
     # - new - XXX
     # We remove such properties here
-    from Base import Base as BaseClass
+    #from Base import Base as BaseClass
     for prop in converted_prop_list:
       if prop['type'] in legalTypes:
         #if not hasattr(property_holder, prop['id']):
@@ -2417,8 +2416,7 @@ def createValueAccessors(property_holder, id,
     property_holder.registerAccessor(setter_name, id, Value.UidSetSetter, accessor_args)
 
 
-def createRelatedValueAccessors(id, read_permission=Permissions.AccessContentsInformation,
-                                    write_permission=Permissions.ModifyPortalContent):
+def createRelatedValueAccessors(property_holder, id, read_permission=Permissions.AccessContentsInformation):
 
   upper_case_id = UpperCase(id)
   # Related Values (ie. reverse relation getters)
@@ -2530,26 +2528,21 @@ def createRelatedValueAccessors(id, read_permission=Permissions.AccessContentsIn
     ),
   }
 
-  permission = read_permission
   for accessor_class, accessor_name_list in accessor_dict.items():
-
-    # First element is the original accessor
-    accessor_name = accessor_name_list[0]
-    accessor = accessor_class(accessor_name, id)
-    if not hasattr(BaseClass, accessor_name):
-      setattr(BaseClass, accessor_name, accessor)
-      # Declare the security of method which doesn't start with _
-      if accessor_name[0] != '_':
-        BaseClass.security.declareProtected(permission, accessor_name)
-
-    # Others are dummy copies
-    for accessor_name in accessor_name_list[1:]:
-      if not hasattr(BaseClass, accessor_name):
-        setattr(BaseClass, accessor_name, 
-                accessor.dummy_copy(accessor_name))
-        # Declare the security of method which doesn't start with _
-        if accessor_name[0] != '_':
-          BaseClass.security.declareProtected(permission, accessor_name)
+    for accessor_name in accessor_name_list:
+      if property_holder is not None:
+        if not hasattr(property_holder, accessor_name):
+          property_holder.registerAccessor(accessor_name, id, accessor_class, ())
+          if accessor_name[0] != '_':
+            property_holder.declareProtected(read_permission, accessor_name)
+      else:
+        accessor = accessor_class(accessor_name, id)
+        if not hasattr(BaseClass, accessor_name):
+          setattr(BaseClass, accessor_name,
+                  accessor.dummy_copy(accessor_name))
+          # Declare the security of method which doesn't start with _
+          if accessor_name[0] != '_':
+            BaseClass.security.declareProtected(read_permission, accessor_name)
 
 def createTranslationAccessors(property_holder, id,
     read_permission=Permissions.AccessContentsInformation,