diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/FIFO%20Delivery%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/FIFO%20Delivery%20Solver.xml
new file mode 100644
index 0000000000000000000000000000000000000000..671ea4cfc5efc04e447bc36054a2eb7237024338
--- /dev/null
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/FIFO%20Delivery%20Solver.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="SolverTypeInformation" module="Products.ERP5Type.Document.SolverTypeInformation"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_property_domain_dict</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>short_title</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>acquire_local_roles</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>The FIFO solver reduces delivered quantity by reducing the quantity of simulation movements from the last order.</string> </value>
+        </item>
+        <item>
+            <key> <string>factory</string> </key>
+            <value> <string>addFIFODeliverySolver</string> </value>
+        </item>
+        <item>
+            <key> <string>group_list</string> </key>
+            <value>
+              <tuple>
+                <string>delivery_solver</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>FIFO Delivery Solver</string> </value>
+        </item>
+        <item>
+            <key> <string>init_script</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>permission</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Solver Type</string> </value>
+        </item>
+        <item>
+            <key> <string>solver_action_title</string> </key>
+            <value> <string>First In, First Out</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <tuple>
+        <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>domain_name</string> </key>
+            <value> <string>erp5_content</string> </value>
+        </item>
+        <item>
+            <key> <string>property_name</string> </key>
+            <value> <string>short_title</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <tuple>
+        <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>domain_name</string> </key>
+            <value> <string>erp5_content</string> </value>
+        </item>
+        <item>
+            <key> <string>property_name</string> </key>
+            <value> <string>title</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/LIFO%20Delivery%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/LIFO%20Delivery%20Solver.xml
new file mode 100644
index 0000000000000000000000000000000000000000..245672af407aa8da0d1534df3df17a6047a599fe
--- /dev/null
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/LIFO%20Delivery%20Solver.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="SolverTypeInformation" module="Products.ERP5Type.Document.SolverTypeInformation"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_property_domain_dict</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>short_title</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>acquire_local_roles</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>The LIFO solver reduces delivered quantity by reducing the quantity of simulation movements from the last order.</string> </value>
+        </item>
+        <item>
+            <key> <string>factory</string> </key>
+            <value> <string>addLIFODeliverySolver</string> </value>
+        </item>
+        <item>
+            <key> <string>group_list</string> </key>
+            <value>
+              <tuple>
+                <string>delivery_solver</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>LIFO Delivery Solver</string> </value>
+        </item>
+        <item>
+            <key> <string>init_script</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>permission</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Solver Type</string> </value>
+        </item>
+        <item>
+            <key> <string>solver_action_title</string> </key>
+            <value> <string>Last In, First Out</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <tuple>
+        <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>domain_name</string> </key>
+            <value> <string>erp5_content</string> </value>
+        </item>
+        <item>
+            <key> <string>property_name</string> </key>
+            <value> <string>short_title</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <tuple>
+        <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>domain_name</string> </key>
+            <value> <string>erp5_content</string> </value>
+        </item>
+        <item>
+            <key> <string>property_name</string> </key>
+            <value> <string>title</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Minimise%20Price%20Delivery%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Minimise%20Price%20Delivery%20Solver.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5bb4f254b5bf9e33421acb2370e6f4a0936264cf
--- /dev/null
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Minimise%20Price%20Delivery%20Solver.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="SolverTypeInformation" module="Products.ERP5Type.Document.SolverTypeInformation"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_property_domain_dict</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>short_title</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>acquire_local_roles</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>The Minimise Price solver reduces delivered quantity by reducing the quantity of simulation movements from the last order.</string> </value>
+        </item>
+        <item>
+            <key> <string>factory</string> </key>
+            <value> <string>addMinimisePriceDeliverySolver</string> </value>
+        </item>
+        <item>
+            <key> <string>group_list</string> </key>
+            <value>
+              <tuple>
+                <string>delivery_solver</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>Minimise Price Delivery Solver</string> </value>
+        </item>
+        <item>
+            <key> <string>init_script</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>permission</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Solver Type</string> </value>
+        </item>
+        <item>
+            <key> <string>solver_action_title</string> </key>
+            <value> <string>Minimise Price</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <tuple>
+        <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>domain_name</string> </key>
+            <value> <string>erp5_content</string> </value>
+        </item>
+        <item>
+            <key> <string>property_name</string> </key>
+            <value> <string>short_title</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <tuple>
+        <global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>domain_name</string> </key>
+            <value> <string>erp5_content</string> </value>
+        </item>
+        <item>
+            <key> <string>property_name</string> </key>
+            <value> <string>title</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_simulation_test/bt/template_path_list b/bt5/erp5_simulation_test/bt/template_path_list
index d0e01a5e7dfb980374487393e2ee8ebac9730a62..250ce098455499ffc23ab61972956e086831b9d1 100644
--- a/bt5/erp5_simulation_test/bt/template_path_list
+++ b/bt5/erp5_simulation_test/bt/template_path_list
@@ -23,6 +23,12 @@ portal_solvers/Accept Solver
 portal_solvers/Accept Solver/*
 portal_solvers/Adopt Solver
 portal_solvers/Adopt Solver/*
+portal_solvers/FIFO Delivery Solver
+portal_solvers/FIFO Delivery Solver/*
+portal_solvers/LIFO Delivery Solver
+portal_solvers/LIFO Delivery Solver/*
+portal_solvers/Minimise Price Delivery Solver
+portal_solvers/Minimise Price Delivery Solver/*
 portal_solvers/Production Reduction Solver
 portal_solvers/Production Reduction Solver/*
 portal_solvers/Quantity Cancel Solver
diff --git a/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml b/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml
index 4e5ddf06a2b3adf2cfd0378051ca8aa2c3d01df3..5bfe8dc6a03c8692958fd24c9394328a95b7cad2 100644
--- a/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml
+++ b/bt5/erp5_trade/PathTemplateItem/portal_deliveries/purchase_packing_list_builder/category_movement_group_on_line.xml
@@ -47,6 +47,7 @@
                 <string>destination_account</string>
                 <string>source_function</string>
                 <string>destination_function</string>
+                <string>specialise</string>
               </tuple>
             </value>
         </item>
diff --git a/product/ERP5/tests/testERP5Simulation.py b/product/ERP5/tests/testERP5Simulation.py
index 625a4127f7a4d8008dee84df1daf8c9c97a3cce4..204497b0f3dbc79a005aab89204c4265cf31b42d 100644
--- a/product/ERP5/tests/testERP5Simulation.py
+++ b/product/ERP5/tests/testERP5Simulation.py
@@ -44,15 +44,6 @@ class TestERP5SimulationMixin(TestInvoiceMixin):
 
   def afterSetUp(self, quiet=1, run=1):
     TestInvoiceMixin.afterSetUp(self)
-    portal_rules = self.portal.portal_rules
-    for rule in portal_rules.objectValues(portal_type='Order Root Simulation Rule'):
-      if rule.getValidationState() == 'validated':
-        rule.invalidate()
-
-    self.validateNewRules()
-    self.setUpBusinessProcess()
-
-  def setUpBusinessProcess(self):
     business_process = self.portal.business_process_module.erp5_default_business_process
     pay_business_link = business_process['pay']
     pay_business_link.setSource('account_module/bank')
@@ -125,296 +116,6 @@ class TestERP5SimulationMixin(TestInvoiceMixin):
     if new_order_rule.getValidationState() != 'validated':
       new_order_rule.validate()
 
-  def stepCreateOrder(self,sequence=None, sequence_list=None, **kw):
-    """
-      Create a empty order
-    """
-    organisation = sequence.get('organisation')
-    project = sequence.get('project')
-#     person = sequence.get('person')
-    portal = self.getPortal()
-    order_module = portal.getDefaultModule(portal_type=self.order_portal_type)
-    order = order_module.newContent(portal_type=self.order_portal_type)
-    order.edit(
-      title = "Order%s" % order.getId(),
-      specialise='business_process_module/erp5_default_business_process',
-      start_date = self.datetime + 10,
-      stop_date = self.datetime + 20,
-    )
-    if organisation is not None:
-      order.edit(source_value=organisation,
-                 source_section_value=organisation,
-                 destination_value=organisation,
-                 destination_section_value=organisation,
-                 # Added for test Packing List Copy
-                 source_decision_value=organisation,
-                 destination_decision_value=organisation,
-                 source_administration_value=organisation,
-                 destination_administration_value=organisation,
-                 )
-    if project is not None:
-      order.edit(source_project_value=project,
-                 destination_project_value=project,
-                 )
-    sequence.edit( order = order )
-
-  def _acceptDecisionQuantity(self, document):
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(document)
-    quantity_solver_decision = filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='quantity',
-      solver_process.contentValues())[0]
-    # use Quantity Accept Solver.
-    quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Accept Solver'])
-    # configure for Accept Solver.
-    kw = {'tested_property_list':['quantity',]}
-    quantity_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def _acceptDivergenceOnInvoice(self, invoice, divergence_list):
-    print invoice, divergence_list
-    return self._acceptDecisionQuantity(invoice)
-
-  def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None):
-    """
-    Solve quantity divergence by using solver tool.
-    """
-    packing_list = sequence.get('packing_list')
-    self._acceptDecisionQuantity(packing_list)
-
-  def stepAcceptDecisionQuantityInvoice(self, sequence=None,
-                                        sequence_list=None):
-    """
-    Solve quantity divergence by using solver tool.
-    """
-    invoice = sequence.get('invoice')
-    self._acceptDecisionQuantity(invoice)
-
-  def stepAcceptDecisionResource(self,sequence=None, sequence_list=None):
-    """
-    Solve quantity divergence by using solver tool.
-    """
-    packing_list = sequence.get('packing_list')
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(packing_list)
-    resource_solver_decision = filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='resource',
-      solver_process.contentValues())[0]
-    # use Resource Replacement Solver.
-    resource_solver_decision.setSolverValue(self.portal.portal_solvers['Accept Solver'])
-    # configure for Accept Solver.
-    kw = {'tested_property_list':['resource',]}
-    resource_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def stepSplitAndDeferPackingList(self, sequence=None, sequence_list=None):
-    """
-      Do the split and defer action
-    """
-    packing_list = sequence.get('packing_list')
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(packing_list)
-    quantity_solver_decision = filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='quantity',
-      solver_process.contentValues())[0]
-    # use Quantity Split Solver.
-    quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Quantity Split Solver'])
-    # configure for Quantity Split Solver.
-    kw = {'delivery_solver':'FIFO Delivery Solver',
-          'start_date':self.datetime + 15,
-          'stop_date':self.datetime + 25}
-    quantity_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-    # build split deliveries manually. XXX ad-hoc
-    previous_tag = None
-    for delivery_builder in packing_list.getBuilderList():
-      this_builder_tag = '%s_split_%s' % (packing_list.getPath(),
-                                          delivery_builder.getId())
-      after_tag = []
-      if previous_tag:
-        after_tag.append(previous_tag)
-      delivery_builder.activate(
-        after_method_id=('solve',
-                         'immediateReindexObject',
-                         'recursiveImmediateReindexObject',), # XXX too brutal.
-        after_tag=after_tag,
-        ).build(explanation_uid=packing_list.getCausalityValue().getUid())
-
-  def _adoptPrevisionQuantity(self, packing_list):
-    """
-    Solve quantity divergence by using solver tool.
-    """
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(packing_list)
-    quantity_solver_decision = filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='quantity',
-      solver_process.contentValues())[0]
-    # use Quantity Adoption Solver.
-    quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Adopt Solver'])
-    # configure for Adopt Solver.
-    kw = {'tested_property_list':['quantity',]}
-    quantity_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def _adoptDivergenceOnInvoice(self, invoice, divergence_list):
-    print invoice, divergence_list
-    return self._adoptPrevisionQuantity(invoice)
-
-  def _adoptDivergenceOnPackingList(self, packing_list, divergence_list):
-    print packing_list, divergence_list
-    return self._adoptPrevisionQuantity(packing_list)
-
-  def stepAdoptPrevisionQuantity(self,sequence=None, sequence_list=None):
-    """
-    Solve quantity divergence by using solver tool.
-    """
-    packing_list = sequence.get('packing_list')
-    self._adoptPrevisionQuantity(packing_list)
-
-  def stepNewPackingListAdoptPrevisionQuantity(self, sequence=None,
-                                               sequence_list=None):
-    """
-    Solve quantity divergence by using solver tool.
-    """
-    packing_list = sequence.get('new_packing_list')
-    self._adoptPrevisionQuantity(packing_list)
-
-  def stepAdoptPrevisionResource(self,sequence=None, sequence_list=None):
-    """
-    Solve resource divergence by using solver tool.
-    """
-    packing_list = sequence.get('packing_list')
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(packing_list)
-    resource_solver_decision = filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='resource',
-      solver_process.contentValues())[0]
-    # use Resource Adopt Solver.
-    resource_solver_decision.setSolverValue(self.portal.portal_solvers['Adopt Solver'])
-    # configure for Adopt Solver.
-    kw = {'tested_property_list':['resource',]}
-    resource_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def stepCheckPackingListLineWithSameResource(self,sequence=None, sequence_list=None):
-    """
-      Look if the packing list has new previsions
-    """
-    old_packing_list_line = sequence.get('packing_list_line')
-    packing_list_line = old_packing_list_line.aq_parent[str(int(old_packing_list_line.getId())-1)]
-    resource = sequence.get('resource')
-    for line in sequence.get('packing_list').getMovementList():
-      self.assertEquals(line.getResourceValue(), resource)
-      self.assertEquals(line.getQuantity(), self.default_quantity)
-      self.assertEquals(line.getCausalityList(),
-                        [x.getParentValue().getParentValue().getDelivery() for x in \
-                         line.getDeliveryRelatedValueList()])
-
-  def stepUnifyDestinationWithDecision(self,sequence=None, sequence_list=None):
-    """
-      Check if simulation movement are disconnected
-    """
-    packing_list = sequence.get('packing_list')
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(packing_list)
-    for destination_solver_decision in filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='destination',
-      solver_process.contentValues()):
-      # use Destination Replacement Solver.
-      destination_solver_decision.setSolverValue(self.portal.portal_solvers['Accept Solver'])
-      # configure for Accept Solver.
-      kw = {'tested_property_list':['destination',]}
-      destination_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def _unifyStartDateWithDecision(self, document):
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(document)
-    for start_date_solver_decision in filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='start_date',
-      solver_process.contentValues()):
-      # use StartDate Replacement Solver.
-      start_date_solver_decision.setSolverValue(self.portal.portal_solvers['Unify Solver'])
-      # configure for Unify Solver.
-      kw = {'tested_property_list':['start_date',],
-            'value':document.getStartDate()}
-      start_date_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def stepUnifyStartDateWithDecision(self,sequence=None, sequence_list=None):
-    packing_list = sequence.get('packing_list')
-    self._unifyStartDateWithDecision(packing_list)
-
-  def stepUnifyStartDateWithDecisionInvoice(self,sequence=None, sequence_list=None):
-    invoice = sequence.get('invoice')
-    self._unifyStartDateWithDecision(invoice)
-
-  def stepUnifyStartDateWithPrevision(self,sequence=None, sequence_list=None):
-    """
-      Check if simulation movement are disconnected
-    """
-    packing_list = sequence.get('packing_list')
-    applied_rule = sequence.get('applied_rule')
-    simulation_line_list = applied_rule.objectValues()
-    start_date = simulation_line_list[-1].getStartDate()
-    solver_process_tool = self.portal.portal_solver_processes
-    solver_process = solver_process_tool.newSolverProcess(packing_list)
-    for start_date_solver_decision in filter(
-      lambda x:x.getCausalityValue().getTestedProperty()=='start_date',
-      solver_process.contentValues()):
-      # use StartDate Replacement Solver.
-      start_date_solver_decision.setSolverValue(self.portal.portal_solvers['Unify Solver'])
-      # configure for Unify Solver.
-      kw = {'tested_property_list':['start_date',],
-            'value':start_date}
-      start_date_solver_decision.updateConfiguration(**kw)
-    solver_process.buildTargetSolverList()
-    solver_process.solve()
-
-  def stepCheckPackingListLineWithDifferentResource(self,sequence=None, sequence_list=None):
-    """
-      Look if the packing list has new previsions
-    """
-    packing_list_line = sequence.get('packing_list_line')
-    new_resource = sequence.get('resource')
-    self.assertEquals(packing_list_line.getQuantity(), self.default_quantity*2)
-    self.assertEquals(packing_list_line.getResourceValue(), new_resource)
-    simulation_line_list = packing_list_line.getDeliveryRelatedValueList()
-    order_line_list = sum([x.getParentValue().getParentValue().getDeliveryList() for x in simulation_line_list], [])
-    self.assertEquals(sorted(packing_list_line.getCausalityList()),
-                      sorted(order_line_list))
-
-  def stepCheckSimulationMovementHasRecordedQuantity(self, sequence=None,
-                                                     sequence_list=None):
-    movement_list = sequence.get('packing_list').objectValues(
-      portal_type=self.packing_list_line_portal_type)
-    self._checkRecordedProperty(movement_list, 'quantity', True)
-
-  def stepCheckSimulationMovementHasNoRecordedQuantity(self, sequence=None,
-                                                       sequence_list=None):
-    movement_list = sequence.get('packing_list').objectValues(
-      portal_type=self.packing_list_line_portal_type)
-    self._checkRecordedProperty(movement_list, 'quantity', False)
-
-  def stepCheckSimulationMovementHasRecordedResource(self, sequence=None,
-                                                     sequence_list=None):
-    movement_list = sequence.get('packing_list').objectValues(
-      portal_type=self.packing_list_line_portal_type)
-    self._checkRecordedProperty(movement_list, 'resource', True)
-
-  def stepCheckSimulationMovementHasNoRecordedResource(self, sequence=None,
-                                                       sequence_list=None):
-    movement_list = sequence.get('packing_list').objectValues(
-      portal_type=self.packing_list_line_portal_type)
-    self._checkRecordedProperty(movement_list, 'resource', False)
-
 class TestERP5Simulation(TestERP5SimulationMixin, ERP5TypeTestCase):
   run_all_test = 1
   quiet = 0
@@ -576,25 +277,6 @@ class TestERP5Simulation(TestERP5SimulationMixin, ERP5TypeTestCase):
 
     sequence_list.play(self, quiet=quiet)
 
-class TestERP5SimulationPackingList(TestERP5SimulationMixin, TestPackingList):
-  pass
-
-for failing_method in [
-  # This test does not work as it is because of the different behaviour of
-  # Adopt Solver.
-  'test_05d_SimulationChangeResourceOnOneSimulationMovementForMergedLine',
-
-  # Those tests currently fail because they are making assertions on an applied
-  # rule which with the new simulation structure is not the same as in the
-  # original test packing list
-  'test_06_SimulationChangeStartDate',
-  'test_07_SimulationChangeStartDateWithTwoOrderLine',
-  'test_07a_SimulationChangeStartDateWithTwoOrderLine',
-  
-  ]:
-  setattr(TestERP5SimulationPackingList, failing_method,
-          expectedFailure(getattr(TestERP5SimulationPackingList, failing_method)))
-        
 class TestERP5SimulationInvoice(TestERP5SimulationMixin, TestSaleInvoice):
   quiet = TestSaleInvoice.quiet
 
diff --git a/product/ERP5/tests/testInvoice.py b/product/ERP5/tests/testInvoice.py
index cc5b1a8fea2edf41468cf6eca0402e309a1f6fd9..4a8b67e053157a9d9bdfae6d9b715045bcb3266e 100644
--- a/product/ERP5/tests/testInvoice.py
+++ b/product/ERP5/tests/testInvoice.py
@@ -964,11 +964,11 @@ class TestInvoiceMixin(TestPackingListMixin,
                                             sequence_list=None):
     invoice = sequence.get('invoice')
     self._solveDeliveryGroupDivergence(invoice, 'start_date',
-                                       invoice.getRelativeUrl())
+       'Unify Solver', value=invoice.getStartDate())
 
   def stepAcceptDecisionQuantityInvoice(self,sequence=None, sequence_list=None):
     invoice = sequence.get('invoice')
-    self._solveDivergence(invoice, 'quantity', 'accept')
+    self._solveDivergence(invoice, 'quantity', 'Accept Solver')
 
   def stepAcceptDecisionInvoice(self, sequence=None, sequence_list=None,
       **kw):
@@ -2313,11 +2313,8 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent(
  
 
   def _acceptDivergenceOnInvoice(self, invoice, divergence_list):
-    builder_list = invoice.getBuilderList()
-    self.assertEquals(2, len(builder_list))
-    for builder in builder_list:
-      builder.solveDivergence(invoice.getRelativeUrl(),
-                              divergence_to_accept_list=divergence_list)
+    print invoice, divergence_list
+    self._solveDivergence(invoice, 'quantity', 'Accept Solver')
 
   def test_accept_quantity_divergence_on_invoice_with_stopped_packing_list(
                 self, quiet=quiet):
@@ -2373,11 +2370,8 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent(
     self.assertEquals('solved', packing_list.getCausalityState())
  
   def _adoptDivergenceOnInvoice(self, invoice, divergence_list):
-    builder_list = invoice.getBuilderList()
-    self.assertEquals(2, len(builder_list))
-    for builder in builder_list:
-      builder.solveDivergence(invoice.getRelativeUrl(),
-                              divergence_to_adopt_list=divergence_list)
+    print invoice, divergence_list
+    self._solveDivergence(invoice, 'quantity', 'Adopt Solver')
 
   def test_adopt_quantity_divergence_on_invoice_line_with_stopped_packing_list(
                 self, quiet=quiet):
diff --git a/product/ERP5/tests/testPackingList.py b/product/ERP5/tests/testPackingList.py
index 9f19bd1d6d1e521ee8c5c14352e7c80e32fae145..dfc561423f3872f7c3508e5b53c02a78510625ef 100644
--- a/product/ERP5/tests/testPackingList.py
+++ b/product/ERP5/tests/testPackingList.py
@@ -294,16 +294,33 @@ class TestPackingListMixin(TestOrderMixin):
       Do the split and defer action
     """
     packing_list = sequence.get('packing_list')
-    kw = {'listbox':[
-      {'listbox_key':line.getRelativeUrl(),
-       'choice':'SplitAndDefer'} for line in packing_list.getMovementList() \
-      if line.isDivergent()]}
-    self.portal.portal_workflow.doActionFor(
-      packing_list,
-      'split_and_defer_action',
-      start_date=self.datetime + 15,
-      stop_date=self.datetime + 25,
-      **kw)
+    solver_process_tool = self.portal.portal_solver_processes
+    solver_process = solver_process_tool.newSolverProcess(packing_list)
+    quantity_solver_decision, = [x for x in solver_process.contentValues()
+      if x.getCausalityValue().getTestedProperty() == 'quantity']
+    # use Quantity Split Solver.
+    quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Quantity Split Solver'])
+    # configure for Quantity Split Solver.
+    kw = {'delivery_solver':'FIFO Delivery Solver',
+          'start_date':self.datetime + 15,
+          'stop_date':self.datetime + 25}
+    quantity_solver_decision.updateConfiguration(**kw)
+    solver_process.buildTargetSolverList()
+    solver_process.solve()
+    # build split deliveries manually. XXX ad-hoc
+    previous_tag = None
+    for delivery_builder in packing_list.getBuilderList():
+      this_builder_tag = '%s_split_%s' % (packing_list.getPath(),
+                                          delivery_builder.getId())
+      after_tag = []
+      if previous_tag:
+        after_tag.append(previous_tag)
+      delivery_builder.activate(
+        after_method_id=('solve',
+                         'immediateReindexObject',
+                         'recursiveImmediateReindexObject',), # XXX too brutal.
+        after_tag=after_tag,
+        ).build(explanation_uid=packing_list.getCausalityValue().getUid())
 
   def stepSplitAndDeferDoNothingPackingList(self, sequence=None, sequence_list=None, **kw):
     """
@@ -627,7 +644,7 @@ class TestPackingListMixin(TestOrderMixin):
       Check if simulation movement are disconnected
     """
     packing_list = sequence.get('new_packing_list')
-    self._solveDivergence(packing_list, 'quantity', 'adopt')
+    self._solveDivergence(packing_list, 'quantity', 'Adopt Solver')
 
   def stepUnifyDestinationWithDecision(self,sequence=None, sequence_list=None, **kw):
     """
@@ -635,7 +652,7 @@ class TestPackingListMixin(TestOrderMixin):
     """
     packing_list = sequence.get('packing_list')
     self._solveDeliveryGroupDivergence(packing_list, 'destination',
-                                       packing_list.getRelativeUrl())
+                                       'Accept Solver')
 
   def stepUnifyStartDateWithDecision(self,sequence=None, sequence_list=None, **kw):
     """
@@ -643,15 +660,13 @@ class TestPackingListMixin(TestOrderMixin):
     """
     packing_list = sequence.get('packing_list')
     self._solveDeliveryGroupDivergence(packing_list, 'start_date',
-                                  packing_list.getRelativeUrl())
+       'Unify Solver', value=packing_list.getStartDate())
 
   def stepUnifyStopDateWithDecision(self,sequence=None, sequence_list=None, **kw):
     """
       Solve divergence on stop date using unify
     """
-    packing_list = sequence.get('packing_list')
-    self._solveDeliveryGroupDivergence(packing_list, 'stop_date',
-                                  packing_list.getRelativeUrl())
+    raise NotImplementedError
 
   def stepUnifyStartDateWithPrevision(self,sequence=None, sequence_list=None, **kw):
     """
@@ -661,58 +676,55 @@ class TestPackingListMixin(TestOrderMixin):
     applied_rule = sequence.get('applied_rule')
     simulation_movement_list = applied_rule.objectValues()
     self._solveDeliveryGroupDivergence(packing_list, 'start_date',
-                                  simulation_movement_list[-1].getRelativeUrl())
+      'Unify Solver', value=simulation_movement_list[-1].getStartDate())
 
   def stepUnifyStopDateWithPrevision(self,sequence=None, sequence_list=None, **kw):
     """
       Solve divergence on stop date using unify
     """
-    packing_list = sequence.get('packing_list')
-    applied_rule = sequence.get('applied_rule')
-    simulation_movement_list = applied_rule.objectValues()
-    self._solveDeliveryGroupDivergence(packing_list, 'stop_date',
-                                  simulation_movement_list[-1].getRelativeUrl())
-
-  def _solveDeliveryGroupDivergence(self, obj, property, target_url):
-    kw = {'delivery_group_listbox':
-          {property:{'choice':target_url}}}
-    self.portal.portal_workflow.doActionFor(
-      obj,
-      'solve_divergence_action',
-      **kw)
+    raise NotImplementedError
+
+  def _solveDeliveryGroupDivergence(self, document, property, solver, **kw):
+    solver_process_tool = self.portal.portal_solver_processes
+    solver_process = solver_process_tool.newSolverProcess(document)
+    for solver_decision in solver_process.contentValues():
+      if solver_decision.getCausalityValue().getTestedProperty() == property:
+        # use Quantity Accept Solver.
+        solver_decision.setSolverValue(self.portal.portal_solvers[solver])
+        # configure for Accept Solver.
+        solver_decision.updateConfiguration(tested_property_list=[property],
+                                            **kw)
+    solver_process.buildTargetSolverList()
+    solver_process.solve()
 
   def stepAcceptDecisionResource(self,sequence=None, sequence_list=None, **kw):
     packing_list = sequence.get('packing_list')
-    self._solveDivergence(packing_list, 'resource', 'accept')
+    self._solveDivergence(packing_list, 'resource', 'Accept Solver')
 
   def stepAcceptDecisionQuantity(self,sequence=None, sequence_list=None, **kw):
     packing_list = sequence.get('packing_list')
-    self._solveDivergence(packing_list, 'quantity', 'accept')
+    self._solveDivergence(packing_list, 'quantity', 'Accept Solver')
 
   def stepAdoptPrevisionResource(self,sequence=None, sequence_list=None, **kw):
     packing_list = sequence.get('packing_list')
-    self._solveDivergence(packing_list, 'resource', 'adopt')
+    self._solveDivergence(packing_list, 'resource', 'Adopt Solver')
 
   def stepAdoptPrevisionQuantity(self,sequence=None, sequence_list=None, **kw):
     packing_list = sequence.get('packing_list')
-    self._solveDivergence(packing_list, 'quantity', 'adopt')
-
-  def _solveDivergence(self, obj, property, decision, group='line'):
-    """
-      Solve divergences for a given property by taking decision.
-      FIXME: Only "line" level divergence are supported
-    """
-    kw = {'%s_group_listbox' % group:{}}
-    for divergence in obj.getDivergenceList():
-      if divergence.getProperty('tested_property') != property:
-        continue
-      sm_url = divergence.getProperty('simulation_movement').getRelativeUrl()
-      kw['line_group_listbox']['%s&%s' % (sm_url, property)] = {
-        'choice':decision}
-    self.portal.portal_workflow.doActionFor(
-      obj,
-      'solve_divergence_action',
-      **kw)
+    self._solveDivergence(packing_list, 'quantity', 'Adopt Solver')
+
+  def _solveDivergence(self, document, property, solver):
+    """Solve divergence by using solver tool"""
+    solver_process_tool = self.portal.portal_solver_processes
+    solver_process = solver_process_tool.newSolverProcess(document)
+    solver_decision, = [x for x in solver_process.contentValues()
+      if x.getCausalityValue().getTestedProperty() == property]
+    # use Quantity Accept Solver.
+    solver_decision.setSolverValue(self.portal.portal_solvers[solver])
+    # configure for Accept Solver.
+    solver_decision.updateConfiguration(tested_property_list=[property])
+    solver_process.buildTargetSolverList()
+    solver_process.solve()
 
   def stepCheckPackingListLineWithNewQuantityPrevision(self,sequence=None, sequence_list=None, **kw):
     """
@@ -734,41 +746,27 @@ class TestPackingListMixin(TestOrderMixin):
     """
     packing_list_line = sequence.get('packing_list_line')
     new_resource = sequence.get('resource')
-    self.assertEquals(packing_list_line.getQuantity(), self.default_quantity)
-    self.assertNotEquals(packing_list_line.getResourceValue(), new_resource)
-    simulation_movement_list = packing_list_line.getDeliveryRelatedValueList()
-    order_line_list = [x.getParentValue().getParentValue().getDelivery() \
-                       for x in simulation_movement_list]
+    self.assertEquals(packing_list_line.getQuantity(), self.default_quantity*2)
+    self.assertEquals(packing_list_line.getResourceValue(), new_resource)
+    simulation_line_list = packing_list_line.getDeliveryRelatedValueList()
+    order_line_list = sum([x.getParentValue().getParentValue().getDeliveryList()
+                           for x in simulation_line_list], [])
     self.assertEquals(sorted(packing_list_line.getCausalityList()),
                       sorted(order_line_list))
-    new_packing_list_line = packing_list_line.aq_parent[str(int(packing_list_line.getId())+1)]
-    self.assertEquals(new_packing_list_line.getQuantity(), self.default_quantity)
-    self.assertEquals(new_packing_list_line.getResourceValue(), new_resource)
-    simulation_movement_list = new_packing_list_line.getDeliveryRelatedValueList()
-    order_line_list = [x.getParentValue().getParentValue().getDelivery() \
-                       for x in simulation_movement_list]
-    self.assertEquals(sorted(new_packing_list_line.getCausalityList()),
-                      sorted(order_line_list))
 
   def stepCheckPackingListLineWithSameResource(self,sequence=None, sequence_list=None, **kw):
     """
       Look if the packing list has new previsions
     """
-    order_line = sequence.get('order_line')
-    packing_list_line = order_line.getCausalityRelatedValue()
-    old_packing_list_line = [x for x in \
-                             sequence.get('packing_list').objectValues() \
-                             if x != packing_list_line][0]
+    old_packing_list_line = sequence.get('packing_list_line')
+    packing_list_line = old_packing_list_line.aq_parent[str(int(old_packing_list_line.getId())-1)]
     resource = sequence.get('resource')
-    self.assertEquals(old_packing_list_line.getQuantity(), 0)
-    self.assertNotEquals(old_packing_list_line.getResourceValue(), resource)
-    self.assertEquals(packing_list_line.getQuantity(), self.default_quantity * 2)
-    self.assertEquals(packing_list_line.getResourceValue(), resource)
-    simulation_movement_list = packing_list_line.getDeliveryRelatedValueList()
-    order_line_list = [x.getParentValue().getParentValue().getDelivery() \
-                       for x in simulation_movement_list]
-    self.assertEquals(sorted(packing_list_line.getCausalityList()),
-                      sorted(order_line_list))
+    for line in sequence.get('packing_list').getMovementList():
+      self.assertEquals(line.getResourceValue(), resource)
+      self.assertEquals(line.getQuantity(), self.default_quantity)
+      self.assertEquals(line.getCausalityList(),
+                        [x.getParentValue().getParentValue().getDelivery()
+                         for x in line.getDeliveryRelatedValueList()])
 
   def stepCheckNewPackingListAfterStartDateAdopt(self,sequence=None, sequence_list=None, **kw):
     """
@@ -996,26 +994,26 @@ class TestPackingListMixin(TestOrderMixin):
 
   def stepCheckSimulationMovementHasRecordedQuantity(self, sequence=None,
                                                      sequence_list=None):
-    movement_list = sequence.get('order').objectValues(
-      portal_type=self.order_line_portal_type)
+    movement_list = sequence.get('packing_list').objectValues(
+      portal_type=self.packing_list_line_portal_type)
     self._checkRecordedProperty(movement_list, 'quantity', True)
 
   def stepCheckSimulationMovementHasNoRecordedQuantity(self, sequence=None,
                                                        sequence_list=None):
-    movement_list = sequence.get('order').objectValues(
-      portal_type=self.order_line_portal_type)
+    movement_list = sequence.get('packing_list').objectValues(
+      portal_type=self.packing_list_line_portal_type)
     self._checkRecordedProperty(movement_list, 'quantity', False)
 
   def stepCheckSimulationMovementHasRecordedResource(self, sequence=None,
                                                      sequence_list=None):
-    movement_list = sequence.get('order').objectValues(
-      portal_type=self.order_line_portal_type)
+    movement_list = sequence.get('packing_list').objectValues(
+      portal_type=self.packing_list_line_portal_type)
     self._checkRecordedProperty(movement_list, 'resource', True)
 
   def stepCheckSimulationMovementHasNoRecordedResource(self, sequence=None,
                                                        sequence_list=None):
-    movement_list = sequence.get('order').objectValues(
-      portal_type=self.order_line_portal_type)
+    movement_list = sequence.get('packing_list').objectValues(
+      portal_type=self.packing_list_line_portal_type)
     self._checkRecordedProperty(movement_list, 'resource', False)
 
 class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
@@ -1179,6 +1177,8 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
 
     sequence_list.play(self, quiet=quiet)
 
+  # This test does not work as it is because of the different behaviour of
+  # Adopt Solver.
   def test_05d_SimulationChangeResourceOnOneSimulationMovementForMergedLine(self, quiet=quiet, run=run_all_test):
     if not run: return
     sequence_list = SequenceList()
@@ -1246,6 +1246,10 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
 
     sequence_list.play(self, quiet=quiet)
 
+  # The 3 following tests currently fail because they are making assertions on
+  # an applied rule which with the new simulation structure is not the same as
+  # in the original test packing list.
+
   def test_06_SimulationChangeStartDate(self, quiet=quiet, run=run_all_test):
     if not run: return
     sequence_list = SequenceList()
@@ -1793,7 +1797,7 @@ class TestSolvingPackingList(TestPackingListMixin, ERP5TypeTestCase):
     self.added_target_solver_list = []
 
   def beforeTearDown(self, quiet=1, run=1):
-    self.portal.portal_rules.default_delivery_simulation_rule.default_quantity_tester.edit(
+    self.portal.portal_rules.new_delivery_simulation_rule.quantity_tester.edit(
       solver=())
     solver_process_type_info = self.portal.portal_types['Solver Process']
     solver_process_type_info.setTypeAllowedContentTypeList(self.original_allowed_content_types)
diff --git a/product/ERP5/tests/testTradeModelLine.py b/product/ERP5/tests/testTradeModelLine.py
index 88e984d8e15a83a1d5c2ef7025bae00c41ff7a77..8fb10da6ce3875496cede85a7e39607477020346 100644
--- a/product/ERP5/tests/testTradeModelLine.py
+++ b/product/ERP5/tests/testTradeModelLine.py
@@ -576,7 +576,7 @@ class TestTradeModelLine(TestTradeModelLineMixin):
     transaction.commit()
     self.tic()
 
-  def test_01b_InvoiceModifyQuantityAndSolveDivergency(self):
+  def test_01b_NewSimulation_InvoiceModifyQuantityAndSolveDivergency(self):
     invoice = self.test_01_OrderWithSimpleTaxedAndDiscountedLines('invoice')
 
     for line in invoice.getMovementList():
diff --git a/product/ERP5Legacy/tests/testLegacyTradeModelLine.py b/product/ERP5Legacy/tests/testLegacyTradeModelLine.py
index 6ef5b18a105ce4bb93bcb28191d34dc5c6bdf015..26e051f12e0a62304a247834630ec256f855ea00 100644
--- a/product/ERP5Legacy/tests/testLegacyTradeModelLine.py
+++ b/product/ERP5Legacy/tests/testLegacyTradeModelLine.py
@@ -38,6 +38,10 @@ from Products.ERP5.tests.testTradeModelLine import *
 TestTradeModelLine.trade_model_path_portal_type = None
 TestTradeModelLine.business_link_portal_type = None
 
+for name in list(TestTradeModelLine.__dict__):
+  if '_NewSimulation_' in name:
+    delattr(TestTradeModelLine, name)
+
 def createBusinessProcess(self, *args, **kw):
   business_process = super(TestTradeModelLine, self) \
     .createBusinessProcess(*args, **kw)