diff --git a/product/ERP5/Document/TradeModelLine.py b/product/ERP5/Document/TradeModelLine.py
index 9fa0caedfca99d0c9b31f5363f80331f5d9a1000..3c2f744445fb7a907232eef878f4225b6e6e1716 100644
--- a/product/ERP5/Document/TradeModelLine.py
+++ b/product/ERP5/Document/TradeModelLine.py
@@ -29,11 +29,12 @@
 
 from AccessControl import ClassSecurityInfo
 
-from Products.ERP5Type import Permissions, PropertySheet, Constraint, interfaces
+from Products.ERP5Type import Permissions, PropertySheet, interfaces
 from Products.ERP5Type.XMLMatrix import XMLMatrix
 
 from Products.ERP5.Document.Amount import Amount
 from Products.ERP5.Variated import Variated
+from Products.ERP5Type.Utils import cartesianProduct
 
 from Products.ERP5.AggregatedAmountList import AggregatedAmountList
 
@@ -70,8 +71,8 @@ class TradeModelLine(XMLMatrix, Amount, Variated):
       raise NotImplementedError('TODO')
 
     def getAggregatedAmountList(self, context, movement_list = None,
-        current_aggregated_amount_list = None, **kw):
-      from Products.ERP5Type.Document import newTempMovement
+        current_aggregated_amount_list = None, base_id='movement', **kw):
+      from Products.ERP5Type.Document import newTempSimulationMovement
 
       normal_resource_use_category_list = self.\
           portal_preferences.getPreferredNormalResourceUseCategoryList()
@@ -109,36 +110,69 @@ class TradeModelLine(XMLMatrix, Amount, Variated):
 
       self_id = self.getParentValue().getId() + '_' + self.getId()
 
-      tmp_movement = [q for q in current_aggregated_amount_list \
+      tmp_movement_list = [q for q in current_aggregated_amount_list \
           if q.getProperty('resource') == self.getResource() ]
-      if len(tmp_movement) > 0:
-        tmp_movement = tmp_movement[0]
+      if len(tmp_movement_list) > 0:
+        tmp_movement_list = tmp_movement_list[:1]
         update = 1
       else:
         update = 0
-        tmp_movement = newTempMovement(self.getPortalObject(), self_id )
-        tmp_movement.edit(
-          causality = self.getRelativeUrl(),
-          resource = self.getResource(),
-          base_application_list = base_application_list,
-          base_contribution_list = self.getBaseContributionList(),
-          price = self.getPrice(),
-          trade_phase_list = self.getTradePhaseList(),
-        )
-
-      modified = 0
-      for movement in movement_list:
-        if set(base_application_list)\
-            .intersection(set(movement.getBaseContributionList())):
-          quantity = tmp_movement.getQuantity(0.0)
-          modified = 1
+        base_category_list = self.getVariationBaseCategoryList()
+        category_list_list = []
+        for base_cat in base_category_list:
+          category_list = self.getVariationCategoryList(
+                                          base_category_list=base_cat)
+          category_list_list.append(category_list)
+        cartesian_product = cartesianProduct(category_list_list)
+        # if categories are used, we want to look for all cells
+        if len(category_list_list) > 0:
+          for cell_coordinates in cartesian_product:
+            cell = self.getCell(base_id=base_id, *cell_coordinates)
+            if cell is None:
+              raise ValueError("Can't find the cell corresponding to those "+\
+                  "cells coordinates : %s" % cell_coordinates)
+            tmp_movement = newTempSimulationMovement(self.getPortalObject(),
+                self_id )
+            tmp_movement.edit(
+                variation_base_category_list = cell.getVariationBaseCategoryList(),
+                variation_category_list = cell.getVariationCategoryList(),
+                causality = self.getRelativeUrl(),
+                resource = self.getResource(),
+                base_application_list = base_application_list,
+                base_contribution_list = self.getBaseContributionList(),
+                price = cell.getPrice(),
+                quantity = cell.getQuantity(0.0),
+                trade_phase_list = self.getTradePhaseList(),
+                )
+            tmp_movement_list.append(tmp_movement)
+        else:
+          tmp_movement = newTempSimulationMovement(self.getPortalObject(),
+              self_id )
           tmp_movement.edit(
-            quantity = quantity + movement.getTotalPrice()
+            causality = self.getRelativeUrl(),
+            resource = self.getResource(),
+            base_application_list = base_application_list,
+            base_contribution_list = self.getBaseContributionList(),
+            price = self.getPrice(),
+            trade_phase_list = self.getTradePhaseList(),
           )
+          tmp_movement_list.append(tmp_movement)
 
-      if not update:
-        if modified:
-          aggregated_amount_list.append(tmp_movement)
+      modified = 0
+      
+      for tmp_movement in tmp_movement_list:
+        for movement in movement_list:
+          if set(base_application_list)\
+              .intersection(set(movement.getBaseContributionList())):
+            quantity = tmp_movement.getQuantity(0.0)
+            modified = 1
+            tmp_movement.edit(
+              quantity = quantity + movement.getTotalPrice()
+            )
+
+        if not update:
+          if modified:
+            aggregated_amount_list.append(tmp_movement)
 
       return aggregated_amount_list