diff --git a/product/ERP5Type/ERP5Type.py b/product/ERP5Type/ERP5Type.py
index befd918d6eea09643cd0e1dcdb5baaf38a84ab47..d51bba6600e1e37492dcc336bcb4853099f35b69 100644
--- a/product/ERP5Type/ERP5Type.py
+++ b/product/ERP5Type/ERP5Type.py
@@ -299,45 +299,48 @@ class ERP5TypeInformation(XMLObject,
         """
         return default
 
-    #
-    #   Agent methods
-    #
-    def _queryFactoryMethod(self, container, default=None):
-
-        if not self.product or not self.factory or container is None:
-            return default
-
-        # In case we aren't wrapped.
-        dispatcher = getattr(container, 'manage_addProduct', None)
-
-        if dispatcher is None:
-            return default
-
-        try:
-            p = dispatcher[self.product]
-        except AttributeError:
-            LOG('Types Tool', ERROR, '_queryFactoryMethod raised an exception',
-                error=exc_info())
-            return default
-
-        m = getattr(p, self.factory, None)
-
-        if m is not None:
-            try:
-                # validate() can either raise Unauthorized or return 0 to
-                # mean unauthorized.
-                permission = self.permission
-                if permission:
-                  if _checkPermission(permission, container):
-                    return m
-                  else:
-                    return default
-                elif getSecurityManager().validate(p, p, self.factory, m):
-                  return m
-            except zExceptions_Unauthorized:  # Catch *all* Unauths!
-                pass
-
-        return default
+    # The following 2 methods should not be used.
+    _getFactoryMethod = deprecated(FactoryTypeInformation._getFactoryMethod)
+    _constructInstance = deprecated(FactoryTypeInformation._constructInstance)
+
+    def _queryFactoryMethod(self, container, temp_object=0):
+      product = self.product
+      factory = self.factory
+      if not product or not factory:
+        return ValueError('Product factory for %s was undefined'
+                          % self.getId())
+      try:
+        p = container.manage_addProduct[product]
+      except AttributeError:
+        pass
+      else:
+        if temp_object:
+          factory = factory[:3] == 'add' and 'newTemp' + factory[3:] or ''
+        m = getattr(p, factory, None)
+        if m is None:
+          return ValueError('Product factory for %s was invalid'
+                            % self.getId())
+        if temp_object:
+          return m
+        permission = self.permission
+        if permission:
+          if _checkPermission(permission, container):
+            return m
+        else:
+          try:
+            # validate() can either raise Unauthorized or return 0 to
+            # mean unauthorized.
+            if getSecurityManager().validate(p, p, factory, m):
+              return m
+          except zExceptions_Unauthorized, e:
+            return e
+      return AccessControl_Unauthorized('Cannot create %s' % self.getId())
+
+    security.declarePublic('isConstructionAllowed')
+    def isConstructionAllowed(self, container):
+      """Test if user is allowed to create an instance in the given container
+      """
+      return not isinstance(self._queryFactoryMethod(container), Exception)
 
     security.declarePublic('constructInstance')
     def constructInstance(self, container, id, created_by_builder=0,
@@ -348,34 +351,20 @@ class ERP5TypeInformation(XMLObject,
       Call the init_script for the portal_type.
       Returns the object.
       """
-      if temp_object:
-        if not self.factory or not self.factory.startswith('add'):
-          raise ValueError('Product factory for %s is invalid: %s'
-                            % (self.getId(), self.factory))
-        p = container.manage_addProduct[self.product]
-        m = getattr(p, 'newTemp' + self.factory[3:])
-        ob = m(id, container)
-        if hasattr(ob, '_setPortalTypeName'):
-          ob.portal_type = self.getId()
-      else:
-        # This is part is copied from CMFCore/TypesTool/constructInstance
-        # In case of temp object, we don't want to check security
-        if (not (hasattr(container, 'isTempObject')
-                 and container.isTempObject())
-            and not self.isConstructionAllowed(container)):
-          raise AccessControl_Unauthorized('Cannot create %s' % self.getId())
-
-        # Then keep on the construction process
-        ob = self._constructInstance(container, id, *args, **kw)
-
-        # Portal type has to be set before setting other attributes
-        # in order to initialize aq_dynamic
-        if hasattr(ob, '_setPortalTypeName'):
-          #ob._setPortalTypeName(self.getId())
-          # XXX rafael: if we use _set because it is trigger by interaction
-          # workflow and it is annoyning without security setted
-          ob.portal_type = self.getId()
-
+      m = self._queryFactoryMethod(container, temp_object)
+      if isinstance(m, Exception):
+        raise m
+      ob = m(id, **kw)
+
+      # Portal type has to be set before setting other attributes
+      # in order to initialize aq_dynamic
+      if hasattr(ob, '_setPortalTypeName'):
+        #ob._setPortalTypeName(self.getId())
+        # XXX rafael: if we use _set because it is trigger by interaction
+        # workflow and it is annoyning without security setted
+        ob.portal_type = self.getId()
+
+      if not temp_object:
         self.updateLocalRolesOnDocument(ob, reindex=False)
 
         # notify workflow after generating local roles, in order to prevent
diff --git a/product/ERP5Type/Utils.py b/product/ERP5Type/Utils.py
index f199254e3cf8f16b390c5823dd9323b7ece87796..feed33933fd2e10517f803def297e235cd4711c4 100644
--- a/product/ERP5Type/Utils.py
+++ b/product/ERP5Type/Utils.py
@@ -457,6 +457,7 @@ class DocumentConstructor(Method):
       if kw: o._edit(force_update=1, **kw)
       if REQUEST is not None:
         REQUEST['RESPONSE'].redirect( 'manage_main' )
+      return o
 
 class TempDocumentConstructor(DocumentConstructor):
 
@@ -480,9 +481,8 @@ class TempDocumentConstructor(DocumentConstructor):
 
       self.klass = TempDocument
 
-    def __call__(self, folder, id, REQUEST=None, **kw):
-      # CMF constructInstance is never used to build temp objects
-      # so we never return the id.
+    def __call__(self, folder, id, REQUEST=None,
+                 activate_kw=None, is_indexable=None, reindex_kw=None, **kw):
       o = self.klass(id)
       if folder.isTempObject():
         folder._setObject(id, o)