diff --git a/product/ERP5/Document/PredicateGroup.py b/product/ERP5/Document/PredicateGroup.py
index 7c8efd08ee339057133b0e2027b3a9beb41c86f9..d121fa10fe1537b38a381971fdad90303a639fb8 100755
--- a/product/ERP5/Document/PredicateGroup.py
+++ b/product/ERP5/Document/PredicateGroup.py
@@ -33,6 +33,9 @@ from Acquisition import aq_base, aq_inner
 from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
 from Products.ERP5Type.Document.Folder import Folder
 from Products.ERP5Type.Document import newTempBase
+from Products.CMFCore.utils import getToolByName
+
+from Products.ERP5Type.Utils import convertToUpperCase
 
 from Products.ERP5.Document.Predicate import Predicate
 from zLOG import LOG
@@ -99,34 +102,13 @@ class PredicateGroup(Folder, Predicate):
   # Declarative interfaces
   __implements__ = ( Interface.Predicate )
 
-  # Factory Type Information
-  factory_type_information = \
-    {    'id'             : portal_type
-       , 'meta_type'      : meta_type
-       , 'description'    : """\
-A bank account number holds a collection of numbers
-and codes (ex. SWIFT, RIB, etc.) which may be used to
-identify a bank account."""
-       , 'icon'           : 'predicate_icon.gif'
-       , 'product'        : 'ERP5'
-       , 'factory'        : 'addPredicateGroup'
-       , 'immediate_view' : 'predicate_view'
-       , 'actions'        :
-      ( { 'id'            : 'view'
-        , 'name'          : 'View'
-        , 'category'      : 'object_view'
-        , 'action'        : 'predicate_view'
-        , 'permissions'   : (
-            Permissions.View, )
-        }
-        ,
-      )
-    }
-
-  def test(self, context):
+  def test(self, context,**kw):
     """
       A Predicate can be tested on a given context
+
+      We can pass parameters in order to ignore some conditions.
     """
+    self = self.asPredicate()
     result = 1
     if not hasattr(aq_base(self), '_identity_criterion'):
       self._identity_criterion = {}
@@ -144,7 +126,9 @@ identify a bank account."""
     tested_base_category = {}
     for c in self.getMembershipCriterionCategoryList():
       bc = c.split('/')[0]
-      if not bc in tested_base_category.keys() :
+      if not bc in tested_base_category.keys() and bc in multimembership_criterion_base_category_list:
+        tested_base_category[bc] = 1
+      elif not bc in tested_base_category.keys() and bc in membership_criterion_base_category_list:
         tested_base_category[bc] = 0
       if bc in multimembership_criterion_base_category_list:
         tested_base_category[bc] = tested_base_category[bc] and context.isMemberOf(c)
@@ -261,5 +245,47 @@ identify a bank account."""
     """
     Returns a temporary Predicate based on the Resource properties
     """
-    return self
+    category_tool = getToolByName(self,'portal_categories')
+    membership_criterion_category_list = list(self.getMembershipCriterionCategoryList())
+    multimembership_criterion_base_category_list = list(self.getMultimembershipCriterionBaseCategoryList())
+    # Look at local categories and make it criterion membership
+    for category in self.getCategoryList():
+      base_category = category_tool.getBaseCategoryId(category)
+      if base_category not in multimembership_criterion_base_category_list:
+        if base_category in self.getPortalCriterionBaseCategoryList(): 
+          multimembership_criterion_base_category_list.append(base_category)
+          membership_criterion_category_list.append(category)
+    criterion_property_list =  list(self.getCriterionPropertyList())
+    identity_criterion = getattr(self,'_identity_criterion',{})
+    range_criterion = getattr(self,'_range_criterion',{})
+    # Look at local properties and make it criterion properties
+    for property in self.getPortalMappedValuePropertyList():
+      if property not in self.getCriterionPropertyList() \
+        and property in self.propertyIds():
+          criterion_property_list.append(property)
+          property_min = property + '_range_min'
+          property_max = property + '_range_max'
+          if hasattr(self,'get%s' % convertToUpperCase(property)) \
+            and self.getProperty(property) is not None:
+            identity_criterion['property'] = self.getProperty(property)
+          elif hasattr(self,'get%s' % convertToUpperCase(property_min)):
+            min = self.getProperty(property_min)
+            max = self.getProperty(property_max)
+            range_criterion[property] = (min,max)
+    # Return a new context with new properties, like if
+    # we have a predicate with local properties
+    new_self = self.asContext(
+        membership_criterion_category=membership_criterion_category_list,
+        multimembership_criterion_base_category=multimembership_criterion_base_category_list,
+        criterion_property_list=criterion_property_list,
+        _identity_criterion=identity_criterion,
+        _range_criterion=range_criterion)
+
+    LOG('PredicateGroup.asPredicate, new_self.getMembershipCriterionCategoryList',0,new_self.getMembershipCriterionCategoryList())
+    LOG('PredicateGroup.asPredicate, new_self.getMultiMembershipCriterionBaseCategoryList',0,new_self.getMultimembershipCriterionBaseCategoryList())
+    LOG('PredicateGroup.asPredicate, new_self.__class__',0,new_self.__class__)
+    return new_self
+
+
+