diff --git a/product/ERP5/Tool/SimulationTool.py b/product/ERP5/Tool/SimulationTool.py
index a25f3574ad8ef88cac9779f4e02183bb5c3d8a0d..6aba19cefb2f1bb3fe063c49ae564f023ef8faf2 100755
--- a/product/ERP5/Tool/SimulationTool.py
+++ b/product/ERP5/Tool/SimulationTool.py
@@ -128,7 +128,7 @@ class SimulationTool (Folder, UniqueObject):
         Update values of simulation movements based on delivery
         target values and solver
       """
-      from Products.ERP5.TargetSolver import Reduce, Defer, SplitAndDefer, CopyToTarget
+      from Products.ERP5.TargetSolver import Reduce, Defer, SplitAndDefer, CopyToTarget, Redirect
       from Products.ERP5.DeliverySolver import Distribute, Copy
 
     def isInitialized(self):
@@ -180,7 +180,12 @@ class SimulationTool (Folder, UniqueObject):
         # to make sure
         new_target = Target(target_quantity = movement.getQuantity(),
                             target_start_date = movement.getStartDate(),
-                            target_stop_date = movement.getStopDate())
+                            target_stop_date = movement.getStopDate(),
+                            target_destination = movement.getDestination(),
+                            target_destination_section = movement.getDestinationSection(),
+                            target_source = movement.getSource(),
+                            target_source_section = movement.getSourceSection())
+
       if not self.isInitialized(): self.initialize()
       solver.solve(movement, new_target)
 
@@ -207,6 +212,31 @@ class SimulationTool (Folder, UniqueObject):
         return result[0].inventory
       return 0.0
 
+    #######################################################
+    # Movement Group Collection / Delivery Creation
+    def collectMovement2(self, movement_list, check_list = None):
+      """
+      group movements in the way we want
+
+      movement_list : the list of movement wich we want to group
+
+      check_list : the list of classes used to group movements. The order
+                   of the list is important and determines by what we will
+                   group movement first
+                   Typically, check_list is :
+                   (DateMovementList,PathMovementList,...)
+      """
+      from Products.ERP5.MovementGroup import RootMovementGroup
+      if check_list is None:
+        check_list = ()
+      s_tool = self.portal_simulation
+      my_root_group = s_tool.root_movement_group.getInstance(check_list=check_list)
+      for movement in movement_list:
+        if not movement in my_root_group.movement_list :
+          my_root_group.append(movement,check_list=check_list)
+
+      return my_root_group
+
     #######################################################
     # Movement Group Collection / Delivery Creation
     def collectMovement(self, movement_list,
@@ -353,12 +383,22 @@ class SimulationTool (Folder, UniqueObject):
           self.destination = movement.getDestination()
           self.source_section = movement.getSourceSection()
           self.destination_section = movement.getDestinationSection()
+          self.target_source = movement.getTargetSource()
+          self.target_destination = movement.getTargetDestination()
+          self.target_source_section = movement.getTargetSourceSection()
+          self.target_destination_section = movement.getTargetDestinationSection()
+
 
         def test(self,movement):
           if movement.getSource() == self.source and \
             movement.getDestination() == self.destination and \
             movement.getSourceSection() == self.source_section and \
-            movement.getDestinationSection() == self.destination_section :
+            movement.getDestinationSection() == self.destination_section and \
+            movement.getTargetSource() == self.target_source and \
+            movement.getTargetDestination() == self.target_destination and \
+            movement.getTargetSourceSection() == self.target_source_section and \
+            movement.getTargetDestinationSection() == self.target_destination_section :
+
             return 1
           else :
             return 0
@@ -514,6 +554,10 @@ class SimulationTool (Folder, UniqueObject):
                                                       destination = path_group.destination,
                                                       source_section = path_group.source_section,
                                                       destination_section = path_group.destination_section,
+                                                      target_source = path_group.source,
+                                                      target_destination = path_group.destination,
+                                                      target_source_section = path_group.source_section,
+                                                      target_destination_section = path_group.destination_section,
                                                       description = of_description,
                                                       title = new_delivery_id
                                                     )
@@ -600,6 +644,11 @@ class SimulationTool (Folder, UniqueObject):
                       
     def buildDeliveryList(self, movement_group):
       # Build deliveries from a list of movements
+      LOG('buildDeliveryList root_group',0,movement_group)
+      LOG('buildDeliveryList root_group.__dict__',0,movement_group.__dict__)
+      for group in movement_group.group_list:
+        LOG('buildDeliveryList group.__dict__',0,group.__dict__)
+      LOG('buildDeliveryList nested_class.__dict__',0,movement_group.nested_class.__dict__)
       
       
       def orderGroupProcessing(order_group, delivery_list, reindexable_movement_list, **kw):
@@ -654,24 +703,25 @@ class SimulationTool (Folder, UniqueObject):
         else:
           # if path is internal ???
           # JPS NEW
-          if path_group.source is None or path_group.destination is None:
+          if path_group.target_source is None or path_group.target_destination is None:
             # Production Path
-            LOG("Builder",0, "Strange Path %s " % path_group.source)
-            LOG("Builder",0, "Strange Path %s " % path_group.destination)
+            LOG("Builder",0, "Strange Path %s " % path_group.target_source)
+            LOG("Builder",0, "Strange Path %s " % path_group.target_destination)
+          LOG("Builder path_group in pathGroupProcessing",0, path_group.__dict__)
   
-          if path_group.source is None or path_group.destination is None:
+          if path_group.target_source is None or path_group.target_destination is None:
             delivery_module = self.rapport_fabrication
             delivery_type = 'Production Report'
             delivery_line_type = 'Production Report Line'
             delivery_cell_type = 'Production Report Cell'
-          elif path_group.destination.find('site/Stock_PF') >= 0 and \
-              path_group.source.find('site/Piquage') >= 0:
+          elif path_group.target_destination.find('site/Stock_PF') >= 0 and \
+              path_group.target_source.find('site/Piquage') >= 0:
             delivery_module = self.livraison_fabrication
             delivery_type = 'Production Packing List'
             delivery_line_type = delivery_type + ' Line'
             delivery_cell_type = 'Delivery Cell'
-          elif path_group.source.find('site/Stock_MP') >= 0 and \
-              path_group.destination.find('site/Piquage') >= 0:
+          elif path_group.target_source.find('site/Stock_MP') >= 0 and \
+              path_group.target_destination.find('site/Piquage') >= 0:
             delivery_module = self.livraison_fabrication
             delivery_type = 'Production Packing List'
             delivery_line_type = delivery_type + ' Line'
@@ -766,7 +816,11 @@ class SimulationTool (Folder, UniqueObject):
                                     source = path_group.source,
                                     destination = path_group.destination,
                                     source_section = path_group.source_section,
-                                    destination_section = path_group.destination_section
+                                    destination_section = path_group.destination_section,
+                                    target_source = path_group.source,
+                                    target_destination = path_group.destination,
+                                    target_source_section = path_group.source_section,
+                                    target_destination_section = path_group.destination_section
                                     )
           delivery = delivery_module[new_delivery_id]
           if order is not None :
@@ -896,6 +950,15 @@ class SimulationTool (Folder, UniqueObject):
                   movement._setTargetStopDate(movement.getTargetStopDate())
                   movement._setStartDate(movement.getTargetStartDate())
                   movement._setStopDate(movement.getTargetStopDate())
+                  movement._setSource(movement.getTargetSource())
+                  movement._setDestination(movement.getTargetDestination())
+                  movement._setTargetSource(movement.getTargetSource())
+                  movement._setTargetDestination(movement.getTargetDestination())
+                  movement._setSourceSection(movement.getTargetSourceSection())
+                  movement._setDestinationSection(movement.getTargetDestinationSection())
+                  movement._setTargetSourceSection(movement.getTargetSourceSection())
+                  movement._setTargetDestinationSection(movement.getTargetDestinationSection())
+
                   # We will reindex later
                   reindexable_movement_list.append(movement)