diff --git a/product/ERP5/Document/TransformedResource.py b/product/ERP5/Document/TransformedResource.py
index 252e4cd53bf683f6cd2d76e0d676adc8e32f8039..8fae4797175b79e45cf189d527f1bef9d391a1c6 100755
--- a/product/ERP5/Document/TransformedResource.py
+++ b/product/ERP5/Document/TransformedResource.py
@@ -40,10 +40,11 @@ from Products.ERP5.Document.Amount import Amount
 from Products.ERP5.Document.Transformation import AggregatedAmountList
 
 from Products.CMFCore.Expression import Expression
+from Products.ERP5.Document.Predicate import Predicate
 
 from zLOG import LOG
 
-class TransformedResource(XMLObject, XMLMatrix, Amount):
+class TransformedResource(Predicate, XMLObject, XMLMatrix, Amount):
     """
         TransformedResource defines which
         resource is being transformed
@@ -81,27 +82,32 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
 
     ### Variation matrix definition
     #
-    security.declareProtected(Permissions.AccessContentsInformation, 'updateVariationCategoryList')
+    security.declareProtected(Permissions.AccessContentsInformation, 
+                              'updateVariationCategoryList')
     def updateVariationCategoryList(self):
       """
-        Check if variation category list of the resource changed and update transformed resource
-        by doing a set cell range
+        Check if variation category list of the resource changed and 
+        update transformed resource by doing a set cell range
       """
-      self.setQVariationBaseCategoryList( self.getQVariationBaseCategoryList() )
-      self.setVVariationBaseCategoryList( self.getVVariationBaseCategoryList() )
+      self.setQVariationBaseCategoryList(self.getQVariationBaseCategoryList())
+      self.setVVariationBaseCategoryList(self.getVVariationBaseCategoryList())
 
-    security.declareProtected(Permissions.ModifyPortalContent, '_updateQMatrixCellRange')
+    security.declareProtected(Permissions.ModifyPortalContent, 
+                              '_updateQMatrixCellRange')
     def _updateQMatrixCellRange(self):
       # XXX use base_id parameter instead
       cell_range =  self.TransformedResource_asCellRange('quantity')
-#      XXX TransformedResource works only for a maximum of 3 variation base category...
-#      Matrixbox must be rewrite for a clean implementation of n base category
+      # XXX TransformedResource works only for a maximum of 3 variation
+      # base category...
+      # Matrixbox must be rewrite for a clean implementation of n base
+      # category
       if len(cell_range) <= 3:
         self.setCellRange(base_id='quantity', *cell_range)
       else:
         raise MoreThan3VariationBaseCategory
 
-    security.declareProtected(Permissions.ModifyPortalContent, '_setQVariationBaseCategoryList')
+    security.declareProtected(Permissions.ModifyPortalContent, 
+                              '_setQVariationBaseCategoryList')
     def _setQVariationBaseCategoryList(self, value):
       """
         Defines the possible base categories which Quantity value (Q)
@@ -111,7 +117,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
       # XXX calling updatecellRange is better
       self._updateQMatrixCellRange()
 
-    security.declareProtected(Permissions.ModifyPortalContent, 'setQVariationBaseCategoryList')
+    security.declareProtected(Permissions.ModifyPortalContent, 
+                              'setQVariationBaseCategoryList')
     def setQVariationBaseCategoryList(self, value):
       """
         Defines the possible base categories which Quantity value (Q)
@@ -120,18 +127,22 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
       self._setQVariationBaseCategoryList(value)
       self.reindexObject()
 
-    security.declareProtected(Permissions.ModifyPortalContent, '_updateVMatrixCellRange')
+    security.declareProtected(Permissions.ModifyPortalContent, 
+                              '_updateVMatrixCellRange')
     def _updateVMatrixCellRange(self):
       # XXX use base_id parameter instead
       cell_range =  self.TransformedResource_asCellRange('variation')
-#      XXX TransformedResource works only for a maximum of 3 variation base category...
-#      Matrixbox must be rewrite for a clean implementation of n base category
+      # XXX TransformedResource works only for a maximum of 3 variation
+      # base category...
+      # Matrixbox must be rewrite for a clean implementation of n base
+      # category
       if len(cell_range) <= 3:
         self.setCellRange(base_id='variation', *cell_range)
       else:
         raise MoreThan3VariationBaseCategory
 
-    security.declareProtected(Permissions.ModifyPortalContent, '_setVVariationBaseCategoryList')
+    security.declareProtected(Permissions.ModifyPortalContent, 
+                              '_setVVariationBaseCategoryList')
     def _setVVariationBaseCategoryList(self, value):
       """
         Defines the possible base categories which Variation value (V)
@@ -141,7 +152,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
       # XXX calling updatecellRange is better
       self._updateVMatrixCellRange()
 
-    security.declareProtected(Permissions.ModifyPortalContent, 'setVVariationBaseCategoryList')
+    security.declareProtected(Permissions.ModifyPortalContent, 
+                              'setVVariationBaseCategoryList')
     def setVVariationBaseCategoryList(self, value):
       """
         Defines the possible base categories which Variation value (V)
@@ -151,7 +163,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
       self.reindexObject()
 
 
-    security.declareProtected(Permissions.AccessContentsInformation,'getVariationRangeCategoryItemList')
+    security.declareProtected(Permissions.AccessContentsInformation,
+                              'getVariationRangeCategoryItemList')
     def getVariationRangeCategoryItemList(self, base_category_list = (),
                                           omit_individual_variation=1, base=1,
                                           current_category=None,
@@ -172,19 +185,18 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
         if resource != None:
           if base_category_list is ():
             base_category_list = resource.getVariationBaseCategoryList()
-
           result = resource.getVariationCategoryItemList(
-                                     base_category_list=base_category_list,
-                                     omit_individual_variation=0,
-                                     base=base,
-                                     current_category=current_category,
-                                     display_base_category=display_base_category,
-                                     display_id=display_id,
-                                     **kw)
-
+                                   base_category_list=base_category_list,
+                                   omit_individual_variation=0,
+                                   base=base,
+                                   current_category=current_category,
+                                   display_base_category=display_base_category,
+                                   display_id=display_id,
+                                   **kw)
         return result
 
-    security.declareProtected(Permissions.AccessContentsInformation,'getVariationRangeCategoryItemList')
+    security.declareProtected(Permissions.AccessContentsInformation,
+                              'getVariationRangeCategoryItemList')
     def getVariationRangeCategoryList(self, base_category_list=()):
         """
           Returns possible variation category values for the
@@ -195,7 +207,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
                           base_category_list=base_category_list))
         return result
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getAggregatedAmountList')
+    security.declareProtected(Permissions.AccessContentsInformation, 
+                              'getAggregatedAmountList')
     def getAggregatedAmountList(self, context=None, REQUEST=None, **kw):
       """
         Get all interesting amount value and return AggregatedAmountList
@@ -203,170 +216,162 @@ class TransformedResource(XMLObject, XMLMatrix, Amount):
       context = self.asContext(context=context, REQUEST=REQUEST, **kw)
       # Create the result object
       aggregated_amount_list = AggregatedAmountList()
-      
-      # Create temporary object to store amount
-      from Products.ERP5Type.Document import newTempAmount
-      tmp_amount = newTempAmount(self.getPortalObject(), self.getId())
-      
-      error_string = ''
-
-      # add resource relation
-      resource = self.getDefaultResourceValue()
-      if resource != None:
-        tmp_amount.setResourceValue(resource)
-      else:
-        error_string += 'No resource defined on %s' % self.getRelativeUrl()
-
-      # First, we set initial values for quantity and variation
-      # Currently, we only consider discrete variations
-      # Continuous variations will be implemented in a future version of ERP5
-
-      quantity_unit = self.getQuantityUnit()
-      if quantity_unit is not None:
-        tmp_amount.setQuantityUnitValue(quantity_unit)
-
-
-      efficiency =  self.getEfficiency()
-      if efficiency is None or efficiency is '' or efficiency == 0.0:
-        efficiency = 1.0
-      else:
-        efficiency = float(efficiency)
-
-      ### current get quantity comportment exemple ###
-      # We define on transformation line:
-      #   default_quantity = q
-      #   quantity matrix
-      #     |   Child | Child/32 | Child/34 | Men | Women |
-      #     |   a     |          |   b      | c   |       |
-      # Result from getAggregatedAmountList:
-      #               context   |    quantity
-      #              _________________________
-      #               Child     |       a
-      #               Child/32  |       a      => acquired from Child
-      #               Child/34  |       a or b => we do not know which cell will be choosed
-      #               Child/36  |       a      => acquired from Child 
-      #               Men       |       c
-      #               Women     |       Error  => no cell found
-      #               noContext |       Error  => cell exist, but no context given
-
-      ### comportment that JPS want ?? ###
-      # We define on transformation line:
-      #   default_quantity = q
-      #   quantity matrix
-      #     |   Child | Child/32 | Child/34 | Men | Women |
-      #     |   a     |          |   b      | c   |       |
-      # Result from getAggregatedAmountList:
-      #               context   |    quantity
-      #              _________________________
-      #               Child     |       a
-      #               Child/32  |       a      => acquired from Child
-      #               Child/34  |       a or b => we do not know which cell will be choosed
-      #               Child/36  |       Error  => no such key in matrixbox cell range
-      #               Men       |       c
-      #               Women     |       Error  => no cell found
-      #               noContext |       Error  => cell exist, but no context given
-
-      # futur cool get quantity comportment exemple 
-      # We define on transformation line:
-      #   default_quantity = q
-      #   quantity matrix
-      #     |   Child | Child/32 | Child/34 | Men | Women |
-      #     |   a     |          |   b      | c   |       |
-      # Result from getAggregatedAmountList:
-      #               context   |    quantity
-      #              _________________________
-      #               Child     |       a
-      #               Child/32  |       a      => acquired from Child
-      #               Child/34  |       b      =>   test method must return a priority to choose between Child and Child/34
-      #               Child/36  |       Error  => no such key in matrixbox cell range
-      #               Men       |       c
-      #               Women     |       q      =>   acquired from default quantity
-      #               noContext |       q      =>   acquired from default quantity
-
-      quantity_defined_by = None
-
-      # get Quantity
-      quantity = None
-      
-      # We will browse the mapped values and determine which apply
-      cell_key_list = self.getCellKeyList( base_id = 'quantity')
-      if cell_key_list not in [(),[]]: 
-
-        if context == None:
-          raise KeyError, "No context defined on TransformedResource '%s'" % ( self.getRelativeUrl() , )
-        
-        for key in cell_key_list:
-          if self.hasCell(base_id='quantity', *key):
-            mapped_value = self.getCell(base_id='quantity', *key)
-            if mapped_value.test(context):
-              if 'quantity' in mapped_value.getMappedValuePropertyList():
-                quantity = mapped_value.getProperty('quantity')
-                quantity_defined_by = mapped_value.getRelativeUrl()
-
+      test_result = self.test(context)
+      if test_result:
+        # The line must match the context
+        # If no predicate is defined on line, the result of the test 
+        # must be true
+        # Create temporary object to store amount
+        from Products.ERP5Type.Document import newTempAmount
+        tmp_amount = newTempAmount(self.getPortalObject(), self.getId())
+        # Create error string
+        error_string = ''
+        # Add resource relation
+        resource = self.getDefaultResourceValue()
+        if resource != None:
+          tmp_amount.setResourceValue(resource)
+        else:
+          error_string += 'No resource defined on %s' % self.getRelativeUrl()
+        # First, we set initial values for quantity and variation
+        # Currently, we only consider discrete variations
+        # Continuous variations will be implemented in a future version 
+        # of ERP5
+        # Set quantity unit
+        quantity_unit = self.getQuantityUnit()
+        if quantity_unit is not None:
+          tmp_amount.setQuantityUnitValue(quantity_unit)
+        # Set efficiency
+        efficiency =  self.getEfficiency()
+        if efficiency is None or efficiency is '' or efficiency == 0.0:
+          efficiency = 1.0
+        else:
+          efficiency = float(efficiency)
+### current get quantity comportment exemple ###
+# We define on transformation line:
+#   default_quantity = q
+#   quantity matrix
+#     |   Child | Child/32 | Child/34 | Men | Women |
+#     |   a     |          |   b      | c   |       |
+# Result from getAggregatedAmountList:
+#               context   |    quantity
+#              _________________________
+#               Child     |       a
+#               Child/32  |       a      => acquired from Child
+#               Child/34  |       a or b => we do not know which cell will be choosed
+#               Child/36  |       a      => acquired from Child 
+#               Men       |       c
+#               Women     |       Error  => no cell found
+#               noContext |       Error  => cell exist, but no context given
+
+### comportment that JPS want ?? ###
+# We define on transformation line:
+#   default_quantity = q
+#   quantity matrix
+#     |   Child | Child/32 | Child/34 | Men | Women |
+#     |   a     |          |   b      | c   |       |
+# Result from getAggregatedAmountList:
+#               context   |    quantity
+#              _________________________
+#               Child     |       a
+#               Child/32  |       a      => acquired from Child
+#               Child/34  |       a or b => we do not know which cell will be choosed
+#               Child/36  |       Error  => no such key in matrixbox cell range
+#               Men       |       c
+#               Women     |       Error  => no cell found
+#               noContext |       Error  => cell exist, but no context given
+
+# futur cool get quantity comportment exemple 
+# We define on transformation line:
+#   default_quantity = q
+#   quantity matrix
+#     |   Child | Child/32 | Child/34 | Men | Women |
+#     |   a     |          |   b      | c   |       |
+# Result from getAggregatedAmountList:
+#               context   |    quantity
+#              _________________________
+#               Child     |       a
+#               Child/32  |       a      => acquired from Child
+#               Child/34  |       b      =>   test method must return a priority to choose between Child and Child/34
+#               Child/36  |       Error  => no such key in matrixbox cell range
+#               Men       |       c
+#               Women     |       q      =>   acquired from default quantity
+#               noContext |       q      =>   acquired from default quantity
+
+        # get Quantity
+        quantity_defined_by = None
+        quantity = None
+        # We will browse the mapped values and determine which apply
+        cell_key_list = self.getCellKeyList(base_id='quantity')
+        if cell_key_list not in [(),[]]: 
+          if context == None:
+            raise KeyError, \
+                  "No context defined on TransformedResource '%s'" % \
+                      (self.getRelativeUrl(), )
+          for key in cell_key_list:
+            if self.hasCell(base_id='quantity', *key):
+              mapped_value = self.getCell(base_id='quantity', *key)
+              if mapped_value.test(context):
+                if 'quantity' in mapped_value.getMappedValuePropertyList():
+                  quantity = mapped_value.getProperty('quantity')
+                  quantity_defined_by = mapped_value.getRelativeUrl()
+          if quantity in [None,'']:
+            raise KeyError, \
+                  "No cell quantity matching on TransformedResource '%s' for \
+                   current context" % ( self.getRelativeUrl() ,   )
+        else:
+          quantity = self.getQuantity()
+          quantity_defined_by = self.getRelativeUrl()
         if quantity in [None,'']:
-          raise KeyError, "No cell quantity matching on TransformedResource '%s' for current context" % ( self.getRelativeUrl() ,   )
-
-      else:
-        quantity = self.getQuantity()
-        quantity_defined_by = self.getRelativeUrl()
-
-      if quantity in [None,'']:
-        raise KeyError, "No quantity defined on TransformedResource '%s' for current context" % ( self.getRelativeUrl() ,   )
-
-      # If we have to do this, then there is a problem....
-      # We'd better have better API for this, like an update function in the mapped_value
-      try:
-        quantity = float(quantity)
-      except ValueError:
-        error_string += 'Quantity is not a float.'
-
-
-      variation_category_list_defined_by = None
-
-      variation_category_list = None
-      # We will browse the mapped values and determine which apply
-      cell_key_list = self.getCellKeyList( base_id = 'variation')
-      if cell_key_list not in [(),[]]: 
-
-        if context == None:
-          raise KeyError, "No context defined on TransformedResource '%s'" % ( self.getRelativeUrl() , )
-        
-        for key in cell_key_list:
-          if self.hasCell(base_id='variation', *key):
-            mapped_value = self.getCell(base_id='variation', *key)
-            if mapped_value.test(context):
-
-              vcl = mapped_value.getCategoryList()
-              if vcl != []:
-                variation_category_list = vcl
-                variation_category_list_defined_by = mapped_value.getRelativeUrl()
-
-        if variation_category_list in [None,'',[], ()]:
-          if quantity == 0:
-            return aggregated_amount_list
-          else:
-            raise KeyError, "No cell variation matching on TransformedResource '%s' for current context" % ( self.getRelativeUrl() ,   )
-
-      else:
-        variation_category_list = self._getVariationCategoryList()
-        variation_category_list_defined_by = self.getRelativeUrl()
-
-
-      tmp_amount._edit(
-        # Properties define on transformation line
-        description =  self.getDescription(),
-        efficiency = efficiency,
-        quantity = quantity,
-
-        # This fields only store some informations for debugging if necessary
-        quantity_defined_by  = quantity_defined_by,
-        variation_category_list_defined_by = variation_category_list_defined_by, 
-        error_string = error_string
-      )
-
-      tmp_amount.setVariationCategoryList(variation_category_list)
-        
-      aggregated_amount_list.append( tmp_amount )
-
+          raise KeyError, \
+                "No quantity defined on TransformedResource '%s' for \
+                 current context" % (self.getRelativeUrl(), )
+        # If we have to do this, then there is a problem....
+        # We'd better have better API for this, 
+        # like an update function in the mapped_value
+        try:
+          quantity = float(quantity)
+        except ValueError:
+          error_string += 'Quantity is not a float.'
+        # Get the variation category list
+        variation_category_list_defined_by = None
+        variation_category_list = None
+        # We will browse the mapped values and determine which apply
+        cell_key_list = self.getCellKeyList( base_id = 'variation')
+        if cell_key_list not in [(),[]]: 
+          if context == None:
+            raise KeyError, \
+                  "No context defined on TransformedResource '%s'" % \
+                      (self.getRelativeUrl(), )
+          for key in cell_key_list:
+            if self.hasCell(base_id='variation', *key):
+              mapped_value = self.getCell(base_id='variation', *key)
+              if mapped_value.test(context):
+                vcl = mapped_value.getCategoryList()
+                if vcl != []:
+                  variation_category_list = vcl
+                  variation_category_list_defined_by = \
+                      mapped_value.getRelativeUrl()
+          if variation_category_list in [None,'',[], ()]:
+            if quantity == 0:
+              return aggregated_amount_list
+            else:
+              raise KeyError, \
+                    "No cell variation matching on TransformedResource '%s' \
+                     for current context" % (self.getRelativeUrl(), )
+        else:
+          variation_category_list = self._getVariationCategoryList()
+          variation_category_list_defined_by = self.getRelativeUrl()
+        # Store values in Amount
+        tmp_amount._edit(
+          # Properties define on transformation line
+          description =  self.getDescription(),
+          efficiency = efficiency,
+          quantity = quantity,
+          # This fields only store some informations for debugging if necessary
+          quantity_defined_by  = quantity_defined_by,
+          variation_category_list_defined_by = variation_category_list_defined_by, 
+          error_string = error_string
+        )
+        tmp_amount.setVariationCategoryList(variation_category_list)
+        aggregated_amount_list.append( tmp_amount )
       return aggregated_amount_list
-