diff --git a/product/ERP5/Document/Delivery.py b/product/ERP5/Document/Delivery.py
index 3412faa63edfe5aead4a330e120b230aee5693a5..32feb2199f397f4e7d364c9a8c0eaa49211146f9 100755
--- a/product/ERP5/Document/Delivery.py
+++ b/product/ERP5/Document/Delivery.py
@@ -309,13 +309,16 @@ une liste de mouvements..."""
       return wf._getWorkflowStateOf(self, id_only=id_only )
 
     security.declareProtected(Permissions.ModifyPortalContent, 'expand')
-    def expand(self, applied_rule_id):
+    def expand(self, applied_rule_id,force=0,**kw):
       """
         Reexpand applied rule
       """
       my_applied_rule = self.portal_simulation.get(applied_rule_id, None)
+      LOG('Delivery.expand, force',0,force)
+      LOG('Delivery.expand, my_applied_rule',0,my_applied_rule)
+      LOG('Delivery.expand, my_applied_rule.expand',0,my_applied_rule.expand)
       if my_applied_rule is not None:
-        my_applied_rule.expand()
+        my_applied_rule.expand(force=force,**kw)
         my_applied_rule.immediateReindexObject()
       else:
         LOG("ERP5 Error:", 100, "Could not expand applied rule %s for delivery %s" % (applied_rule_id, self.getId()))
@@ -643,6 +646,10 @@ une liste de mouvements..."""
 
     security.declareProtected(Permissions.View, 'isArrowDivergent')
     def isArrowDivergent(self):
+      LOG('Delivery.isArrowDivergent, self.isSourceDivergent()',0,self.isSourceDivergent())
+      LOG('Delivery.isArrowDivergent, self.isDestinationDivergent()',0,self.isDestinationDivergent())
+      LOG('Delivery.isArrowDivergent, self.isSourceSectionDivergent()',0,self.isSourceSectionDivergent())
+      LOG('Delivery.isArrowDivergent, self.isDestinationSectionDivergent()',0,self.isDestinationSectionDivergent())
       if self.isSourceDivergent(): return 1
       if self.isDestinationDivergent(): return 1
       if self.isSourceSectionDivergent(): return 1
@@ -655,9 +662,11 @@ une liste de mouvements..."""
         Source is divergent if simulated and target values differ
         or if multiple sources are defined
       """
-      return self.getSource() != self.getTargetSource() \
+      if self.getSource() != self.getTargetSource() \
           or len(self.getSourceList()) > 1 \
-          or len(self.getTargetSourceList()) > 1
+          or len(self.getTargetSourceList()) > 1:
+        return 1
+      return 0
     
     security.declareProtected(Permissions.View, 'isDestinationDivergent')
     def isDestinationDivergent(self):
@@ -665,27 +674,33 @@ une liste de mouvements..."""
         Destination is divergent if simulated and target values differ
         or if multiple destinations are defined
       """
-      return self.getDestination() != self.getTargetDestination() \
+      if self.getDestination() != self.getTargetDestination() \
           or len(self.getDestinationList()) > 1 \
-          or len(self.getTargetDestinationList()) > 1
+          or len(self.getTargetDestinationList()) > 1:
+        return 1
+      return 0
 
     security.declareProtected(Permissions.View, 'isSourceSectionDivergent')
     def isSourceSectionDivergent(self):
       """
         Same as isSourceDivergent for source_section
       """
-      return self.getSourceSection() != self.getTargetSourceSection() \
+      if self.getSourceSection() != self.getTargetSourceSection() \
           or len(self.getSourceSectionList()) > 1 \
-          or len(self.getTargetSourceSectionList()) > 1
+          or len(self.getTargetSourceSectionList()) > 1:
+        return 1
+      return 0
 
     security.declareProtected(Permissions.View, 'isDestinationSectionDivergent')
     def isDestinationSectionDivergent(self):
       """
         Same as isDestinationDivergent for source_section
       """
-      return self.getDestinationSection() != self.getTargetDestinationSection() \
+      if self.getDestinationSection() != self.getTargetDestinationSection() \
           or len(self.getDestinationSectionList()) > 1 \
-          or len(self.getTargetDestinationSectionList()) > 1
+          or len(self.getTargetDestinationSectionList()) > 1:
+        return 1
+      return 0
                 
     security.declareProtected(Permissions.View, 'isDateDivergent')
     def isDateDivergent(self):
@@ -730,6 +745,40 @@ une liste de mouvements..."""
         if line.isDivergent():
           return 1
         
+    security.declareProtected(Permissions.View, 'isQuantityDivergent')
+    def isResourceDivergent(self):
+      """
+      We look at all lines if we have changed the resource, and by
+      doing so we are not consistent with the simulation
+      """
+      LOG('Delivery.isResourceDivergent, self.getPath()',0,self.getPath())
+      if self.isSimulated():
+        LOG('Delivery.isResourceDivergent, self.isSimulated()',0,self.isSimulated())
+        for l in self.contentValues(filter={'portal_type':delivery_movement_type_list}):
+          LOG('Delivery.isResourceDivergent, l.getPath()',0,l.getPath())
+          resource = l.getResource()
+          LOG('Delivery.isResourceDivergent, line_resource',0,l.getResource())
+          simulation_resource_list = l.getDeliveryRelatedValueList()
+          simulation_resource_list += l.getOrderRelatedValueList()
+          for simulation_resource in simulation_resource_list: 
+            LOG('Delivery.isResourceDivergent, sim_resource',0,simulation_resource.getResource())
+            if simulation_resource.getResource()!= resource:
+              return 1
+
+        for m in self.getMovementList():
+          LOG('Delivery.isResourceDivergent, m.getPath()',0,m.getPath())
+          resource = m.getResource()
+          LOG('Delivery.isResourceDivergent, resource',0,resource)
+          simulation_resource_list = m.getDeliveryRelatedValueList()
+          for simulation_resource in simulation_resource_list: 
+            LOG('Delivery.isResourceDivergent, sim_resource',0,simulation_resource.getResource())
+            if simulation_resource.getResource()!= resource:
+              return 1
+            #delivery_cell_related_list = c.getDeliveryRelatedValueList()
+          pass
+
+      return 0
+
     security.declareProtected(Permissions.View, 'isDivergent')
     def isDivergent(self):
       """
@@ -739,9 +788,14 @@ une liste de mouvements..."""
 
         emit targetUnreachable !
       """
+      LOG('Delivery.isDivergent, self.isArrowDivergent()',0,self.isArrowDivergent())
+      LOG('Delivery.isDivergent, self.isDateDivergent()',0,self.isDateDivergent())
+      LOG('Delivery.isDivergent, self.isQuantityDivergent()',0,self.isQuantityDivergent())
+      LOG('Delivery.isDivergent, self.isResourceDivergent()',0,self.isResourceDivergent())
       if self.isArrowDivergent(): return 1
       if self.isDateDivergent(): return 1
       if self.isQuantityDivergent(): return 1
+      if self.isResourceDivergent(): return 1
       
       return 0
 
@@ -1168,14 +1222,23 @@ une liste de mouvements..."""
         creating DeliveryRules for new resources and setting target_quantity to 0 for resources
         which are no longer delivered
         
-        propagateResourceToSimulation has priority (ie. must be executed befoire) over updateFromSimulation        
+        propagateResourceToSimulation has priority (ie. must be executed before) over updateFromSimulation        
       """            
       unmatched_simulation_movement = []
       unmatched_delivery_movement = []
+      LOG('propagateResourceToSimulation, ',0,'starting')
       for l in self.contentValues(filter={'portal_type':delivery_movement_type_list}):
+        LOG('propagateResourceToSimulation, l.getPhysicalPath()',0,l.getPhysicalPath())
+        LOG('propagateResourceToSimulation, l.objectValues()',0,l.objectValues())
+        LOG('propagateResourceToSimulation, l.hasCellContent()',0,l.hasCellContent())
+        LOG('propagateResourceToSimulation, l.showDict()',0,l.showDict())
         if l.hasCellContent():
           for c in l.contentValues(filter={'portal_type':delivery_movement_type_list}):
+            LOG('propagateResourceToSimulation, c.getPhysicalPath()',0,c.getPhysicalPath())
             for s in c.getDeliveryRelatedValueList():
+              LOG('propagateResourceToSimulation, s.getPhysicalPath()',0,s.getPhysicalPath())
+              LOG('propagateResourceToSimulation, c.getResource()',0,c.getResource())
+              LOG('propagateResourceToSimulation, s.getResource()',0,s.getResource())
               if s.getResource() != c.getResource() or s.getVariationText() != c.getVariationText(): # We should use here some day getVariationValue and __cmp__
                 unmatched_delivery_movement.append(c)
                 unmatched_simulation_movement.append(s)
@@ -1188,9 +1251,16 @@ une liste de mouvements..."""
               unmatched_simulation_movement.append(s)
               s.setDelivery(None) # Disconnect
               l._setQuantity(0.0) 
+      LOG('propagateResourceToSimulation, unmatched_simulation_movement',0,unmatched_simulation_movement)
       # Build delivery list with unmatched_simulation_movement          
       root_group = self.portal_simulation.collectMovement(unmatched_simulation_movement)
       new_delivery_list = self.portal_simulation.buildDeliveryList(root_group) 
+      simulation_state = self.getSimulationState()
+      if simulation_state == 'confirmed':
+        for new_delivery in new_delivery_list:
+          new_delivery.confirm()
+
+      LOG('propagateResourceToSimulation, new_delivery_list',0,new_delivery_list)
       # And merge into us
       if len(new_delivery_list)>0:
         list_to_merge = [self]