diff --git a/product/ERP5/Tool/DomainTool.py b/product/ERP5/Tool/DomainTool.py
index 721dde615a3886535abdac330c2fd57768c27c0b..bee67c696b775cfaece160e8280f19e68fcbf98e 100755
--- a/product/ERP5/Tool/DomainTool.py
+++ b/product/ERP5/Tool/DomainTool.py
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
 #                    Jean-Paul Smets-Solanes <jp@nexedi.com>
+#                    Sebastien Robin <seb@nexedi.com>
 #
 # WARNING: This program as such is intended to be used by professional
 # programmers who take the whole responsability of assessing all potential
@@ -35,6 +36,7 @@ from Products.ERP5Type import Permissions
 from Products.ERP5Type import _dtmldir
 from Products.ERP5Type.Tool.BaseTool import BaseTool
 from Products.ERP5Type.Document.Folder import Folder
+from zLOG import LOG
 
 class DomainTool(BaseTool):
     """
@@ -56,4 +58,81 @@ class DomainTool(BaseTool):
     security.declareProtected( Permissions.ManagePortal, 'manage_overview' )
     manage_overview = DTMLFile( 'explainDomainTool', _dtmldir )
 
+    security.declarePublic('searchPredicateList')
+    def searchPredicateList(self,context,test=1,**kw):
+      """
+      Search all predicates wich corresponds to this particular context.
+      """
+      portal_catalog = context.portal_catalog
+      portal_categories = context.portal_categories
+      column_list = []
+      expression_list = []
+      checked_column_list = []
+      sql_kw = {}
+      for column in portal_catalog.getColumnIds():
+        if column.startswith('predicate.'):
+          column_list.append(column.split('.')[1])
+      for column in column_list:
+        if column in checked_column_list:
+          continue
+        range_property = 0
+        if column.endswith('_min') or column.startswith('_max'):
+          range_property = 1
+          property = column[-len('_min')]
+        if '%s_min' % column in column_list:
+          range_property = 1
+          property = column
+        if range_property:
+          # We have to check a range property
+          base_name = 'predicate.%s' % property
+          value = context.getProperty(property)
+          if value is None:
+            expression_list.append('%s is NULL AND %s_min is NULL AND %s_max is NULL' % ((base_name,)*3))
+          else:
+            expression =     '%s is NULL AND %s_min is NULL AND %s_max is NULL ' % ((base_name,)*3) 
+            expression += 'OR %s = %s ' % (base_name,value)
+            expression += 'OR %s_min <= %s AND %s_max is NULL ' % (base_name,value,base_name)
+            expression += 'OR %s_min is NULL AND %s_max > %s ' % (base_name,base_name,value)
+            expression += 'OR %s_min <= %s AND %s_max > %s ' % (base_name,value,base_name,value)
+            expression_list.append(expression)
+          checked_column_list.append('%s' % property)
+          checked_column_list.append('%s_min' % property)
+          checked_column_list.append('%s_max' % property)
+      # Add predicate.uid for automatic join
+      sql_kw['predicate.uid'] = '!=0'
+      where_expression = ' OR '.join(expression_list)
+
+      # Add category selection
+      category_list = context.getCategoryList()
+      if len(category_list)==0:
+        category_list = ['NULL']
+      category_expression = portal_categories.buildSQLSelector(category_list,query_table='predicate_category')
+      if len(where_expression)>0:
+        where_expression += ' AND (%s)' % category_expression
+      else:
+        where_expression = category_expression
+      sql_kw['where_expression'] = where_expression
+      # Add predicate_category.uid for automatic join
+      sql_kw['predicate_category.uid'] = '!=0'
+      kw.update(sql_kw)
+
+      sql_result_list = portal_catalog.searchResults(**kw)
+      result_list = []
+      for predicate in [x.getObject() for x in sql_result_list]:
+        if test or predicate.test(context):
+          result_list.append(predicate)
+      return result_list
+
+    security.declarePublic('generateMappedValue')
+    def generateMappedValue(self,context,test=1,**kw):
+      """
+      """
+      pass
+
+
+
+
+
+
+
 InitializeClass(DomainTool)