diff --git a/product/ERP5Catalog/CatalogTool.py b/product/ERP5Catalog/CatalogTool.py
index df3b68597f4d5b488451e2b018d97d65b3650236..31a1c7639df74874fde9dd9ea35551bacc06f44e 100755
--- a/product/ERP5Catalog/CatalogTool.py
+++ b/product/ERP5Catalog/CatalogTool.py
@@ -106,7 +106,6 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool):
 
     manage_options = ( { 'label' : 'Overview', 'action' : 'manage_overview' },
                        { 'label' : 'Filter', 'action' : 'manage_filter' },
-                       { 'label' : 'Schema', 'action' : 'manage_schema' },
                      ) + ZCatalog.manage_options
 
 
@@ -354,12 +353,26 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool):
         """
         kw[ 'allowedRolesAndUsers' ] = self.getAllowedRolesAndUsers(**kw) # XXX allowedRolesAndUsers naming is wrong
 
-        #if not _checkPermission(
-        #    CMFCorePermissions.AccessInactivePortalContent, self ):
-        #    base = aq_base( self )
-        #    now = DateTime()
-        #    #kw[ 'effective' ] = { 'query' : now, 'range' : 'max' }
-        #    #kw[ 'expires'   ] = { 'query' : now, 'range' : 'min' }
+        # Patch for ERP5 by JP Smets in order
+        # to implement worklists and search of local roles
+        if kw.has_key('local_roles'):
+          # Only consider local_roles if it is not empty
+          if kw['local_roles'] != '' and  kw['local_roles'] != [] and  kw['local_roles'] is not None:
+            local_roles = kw['local_roles']
+            # Turn it into a list if necessary according to ';' separator
+            if type(local_roles) == type('a'):
+              local_roles = local_roles.split(';')
+            # Local roles now has precedence (since it comes from a WorkList)
+            kw[ 'allowedRolesAndUsers' ] = []
+            for role in local_roles:
+                 kw[ 'allowedRolesAndUsers' ].append('user:%s:%s' % (user, role))
+
+        if not _checkPermission(
+            CMFCorePermissions.AccessInactivePortalContent, self ):
+            base = aq_base( self )
+            now = DateTime()
+            kw[ 'effective' ] = { 'query' : now, 'range' : 'max' }
+            kw[ 'expires'   ] = { 'query' : now, 'range' : 'min' }
 
         #LOG("search allowedRolesAndUsers",0,str(kw[ 'allowedRolesAndUsers' ]))
         return apply(ZCatalog.searchResults, (self, REQUEST), kw)
@@ -393,9 +406,11 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool):
             vars = wf.getCatalogVariablesFor(object)
         else:
             vars = {}
+        LOG('catalog_object vars', 0, str(vars))            
         w = IndexableObjectWrapper(vars, object)
         (security_uid, optimised_roles_and_users) = self.getSecurityUid(object, w)
         #LOG('catalog_object optimised_roles_and_users', 0, str(optimised_roles_and_users))
+        # XXX we should build vars begore building the wrapper
         if optimised_roles_and_users is not None:
           vars['optimised_roles_and_users'] = optimised_roles_and_users
         else:
@@ -403,6 +418,7 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool):
         vars['security_uid'] = security_uid
         #LOG("IndexableObjectWrapper", 0,str(w.allowedRolesAndUsers()))
         #try:
+        LOG('catalog_object wrapper', 0, str(w.__dict__))  
         ZCatalog.catalog_object(self, w, uid, idxs=idxs, is_object_moved=is_object_moved)
         #except:
           # When we import data into Zope
@@ -456,9 +472,10 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool):
         # Find parent document (XXX this extra step should be deactivated on complex ERP5 installations)
         object_path = object.getPhysicalPath()
         portal_path = object.portal_url.getPortalObject().getPhysicalPath()
-        if len(object_path) > len(portal_path) + 2:
-          # We are now in the case of a subobject of a root document
-          # We want to return single security information
+        if len(object_path) > len(portal_path) + 2 and getattr(object, 'isRADContent', 0):
+          # This only applied to ERP5 Contents (not CPS)
+          # We are now in the case of a subobject of a root document          
+          # We want to return single security information          
           document_object = aq_inner(object)
           for i in range(0, len(object_path) - len(portal_path) - 2):
             document_object = document_object.aq_parent