diff --git a/product/ERP5/Document/Resource.py b/product/ERP5/Document/Resource.py
index 8ab3f4e9e504576fb57755f25620df276fe32633..20106fe98acc9cf007b8c00ddf88c4b9a15515e0 100755
--- a/product/ERP5/Document/Resource.py
+++ b/product/ERP5/Document/Resource.py
@@ -31,15 +31,16 @@ from AccessControl import ClassSecurityInfo
 from DateTime import DateTime
 
 from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
-from Products.ERP5Type.XMLObject import XMLObject
+from Products.ERP5Type.XMLMatrix import XMLMatrix
 
 from Products.ERP5.Variated import Variated
 from Products.ERP5.Core.Resource import Resource as CoreResource
 from Products.ERP5.ERP5Globals import resource_type_list, variation_type_list, default_section_category, current_inventory_state_list, future_inventory_state_list, reserved_inventory_state_list
+from Products.ERP5.Document.SupplyLine import SupplyLineMixin
 
 from zLOG import LOG
 
-class Resource(XMLObject, CoreResource, Variated):
+class Resource(XMLMatrix, CoreResource, Variated):
     """
       A Resource
     """
@@ -149,6 +150,17 @@ a service in a public administration)."""
                   result += [(o.getRelativeUrl(),o.getRelativeUrl())]
         return result
 
+    security.declareProtected(Permissions.AccessContentsInformation,
+                                           'getVariationRangeCategoryList')
+    def getVariationRangeCategoryList(self, base_category_list = (), base=1, root=1,
+                                                display_id='getTitle', current_category=None):
+        """
+          Returns the range of acceptable categories          
+        """        
+        return map(lambda x: x[0], self.getVariationRangeCategoryItemList(base_category_list=base_category_list,
+                                   base=base, root=root, display_id=display_id, current_category=current_category))
+        
+    
     security.declareProtected(Permissions.AccessContentsInformation,
                                            'getVariationCategoryItemList')
     def getVariationCategoryItemList(self, base_category_list = (),  base=1,
@@ -527,3 +539,86 @@ a service in a public administration)."""
     def _updateIndustrialPrice(self, context):
       # Do nothing by default
       pass
+
+    security.declareProtected( Permissions.ModifyPortalContent, '_setVariationCategoryList' )
+    def _setVariationCategoryList(self, value):
+      """
+          Define the indices provided
+          one list per index (kw)
+
+          Any number of list can be provided
+      """
+      exclude_category = []
+      try:
+        other_variations = self.searchFolder(portal_type = variation_type_list)
+      except:
+        other_variations = []
+      if len(other_variations) > 0:
+        for o_brain in other_variations:
+          o = o_brain.getObject()
+          for v in o.getVariationBaseCategoryList():
+            exclude_category.append('%s/%s' % (v, o.getRelativeUrl()))      
+      Variated._setVariationCategoryList(self, filter(lambda x: x not in exclude_category, value))
+      # Update the cell range automatically
+      # This is far from easy and requires some specific wizzardry
+      base_id = 'path'
+      kwd = {'base_id': base_id}
+      new_range = self.SupplyLine_asCellRange() # This is a site dependent script
+      self._setCellRange(*new_range, **kwd )
+      cell_range_key_list = self.getCellRangeKeyList(base_id = base_id)
+      if cell_range_key_list <> [[None, None]] :
+        for k in cell_range_key_list:
+          #LOG('new cell',0,str(k))
+          c = self.newCell(*k, **kwd)
+          c.edit( domain_base_category_list = self.getVariationBaseCategoryList(),
+                  mapped_value_property_list = ( 'price',),
+                  predicate_operator = 'SUPERSET_OF',
+                  predicate_category_list = filter(lambda k_item: k_item is not None, k),
+                  variation_category_list = filter(lambda k_item: k_item is not None, k),
+                  force_update = 1
+                ) # Make sure we do not take aquisition into account
+      else:
+        # If only one cell, delete it
+        cell_range_id_list = self.getCellRangeIdList(base_id = base_id)
+        for k in cell_range_id_list:
+          if self.get(k) is not None:
+            self[k].flushActivity(invoke=0)
+            self[k].immediateReindexObject() # We are forced to do this is url is changed (not uid)
+            self._delObject(k)
+
+      # TO BE DONE XXX
+      # reindex cells when price, quantity or source/dest changes
+    
+    # For generation of matrix lines
+    security.declareProtected( Permissions.ModifyPortalContent, '_setQuantityStepList' )
+    def _setQuantityStepList(self, value):        
+      self._baseSetQuantityStepList(value)
+      value = self.getQuantityStepList()
+      value.sort()
+      for pid in self.contentIds(filter={'portal_type': 'Predicate'}):
+        self.deleteContent(pid)
+      value = value + [None]
+      for i in range(0, len(value) - 1):
+        p = self.newContent(id = 'quantity_range_%s' % i, portal_type = 'Predicate')
+        p.setCriterionPropertyList(('quantity', ))
+        p.setCriterion('quantity', min=value[i], max=value[i+1])              
+        p.setTitle('%s <= quantity < %s' % (repr(value[i]),repr(value[i+1])))
+      self._setVariationCategoryList(self.getVariationRangeCategoryList(root=0))
+    
+    # Predicate handling    
+    security.declareProtected(Permissions.AccessContentsInformation, 'asPredicate')
+    def asPredicate(self):
+      """
+      Returns a temporary Predicate based on the Resource properties
+      """
+      from Products.ERP5 import newTempPredicateGroup as newTempPredicate
+      p = newTempPredicate(self.getId(), uid = self.getUid())
+      p.setMembershipCriterionBaseCategoryList(('resource',))
+      p.setMembershipCriterionCategoryList(('resource/%s' % self.getRelativeUrl(),))
+      return p
+    
+#monkeyPatch(SupplyLineMixin)        
+from types import FunctionType
+for id, m in SupplyLineMixin.__dict__.items():
+    if type(m) is FunctionType:
+        setattr(Resource, id, m)