diff --git a/product/ERP5/tests/testInvoice.py b/product/ERP5/tests/testInvoice.py
index 971f8fc1ec564342afa6545fd15153202df9cfca..398d6a697f2dd863270ef37f64655e7a6a401419 100644
--- a/product/ERP5/tests/testInvoice.py
+++ b/product/ERP5/tests/testInvoice.py
@@ -26,7 +26,6 @@
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #
 ##############################################################################
-
 """
   Tests invoice creation from simulation.
 
@@ -35,24 +34,35 @@ TODO:
   * check divergence 
   
 """
+
+from random import randint
+
 import os, sys
 if __name__ == '__main__':
-  execfile(os.path.join(sys.path[0], 'framework.py'))
+    execfile(os.path.join(sys.path[0], 'framework.py'))
 
 # Needed in order to have a log file inside the current folder
 os.environ['EVENT_LOG_FILE'] = os.path.join(os.getcwd(), 'zLOG.log')
 os.environ['EVENT_LOG_SEVERITY'] = '-300'
 
+from Testing import ZopeTestCase
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl.SecurityManagement import newSecurityManager, \
+                                             noSecurityManager
 from DateTime import DateTime
+from Acquisition import aq_base, aq_inner
 from zLOG import LOG
-from testPackingList import TestPackingListMixin
+from Products.ERP5Type.DateUtils import addToDate
 from Products.ERP5Type.tests.Sequence import Sequence, SequenceList
+import time
+import os
+from Products.ERP5Type import product_path
+from Products.CMFCore.utils import getToolByName
+from testPackingList import TestPackingListMixin
 from testAccountingRules import TestAccountingRulesMixin
 
-class TestInvoice(TestAccountingRulesMixin,
-                  TestPackingListMixin,
+class TestInvoice(TestPackingListMixin,
+                  TestAccountingRulesMixin,
                   ERP5TypeTestCase):
   """Test invoice are created from orders then packing lists. """
   
@@ -115,12 +125,16 @@ class TestInvoice(TestAccountingRulesMixin,
   def stepCreateEntities(self, sequence, **kw) :
     """Create a vendor and a client. """
     self.stepCreateOrganisation1(sequence, **kw)
-    sequence.edit(client = sequence.get('organisation'))
     self.stepCreateOrganisation2(sequence, **kw)
-    vendor = sequence.get('organisation')
-    vendor.setRegion(self.default_region)
-    self.assertNotEquals(vendor.getRegionValue(), None)
-    sequence.edit(vendor = vendor)
+    self.stepCreateOrganisation3(sequence, **kw)
+    sequence.edit(vendor=sequence.get('organisation1'))
+    client1 = sequence.get('organisation2')
+    client1.setRegion(self.default_region)
+    self.assertNotEquals(client1.getRegionValue(), None)
+    sequence.edit(client1=client1)
+    client2 = sequence.get('organisation3')
+    self.assertEquals(client2.getRegionValue(), None)
+    sequence.edit(client2=client2)
   
   def stepCreateCurrency(self, sequence, **kw) :
     """Create a default currency. """
@@ -148,23 +162,17 @@ class TestInvoice(TestAccountingRulesMixin,
 
     portal = self.getPortal()
     account_module = self.getAccountModule()
-    if not 'receivable_vat' in account_module.objectIds():
-      vat_account = account_module.newContent(id='receivable_vat')
-      vat_account.setGap(self.vat_gap)
-      portal.portal_workflow.doActionFor(vat_account,
-          'validate_action', wf_id='account_workflow')
+    for account_id, account_gap in (('receivable_vat', self.vat_gap),
+                                    ('sale', self.sale_gap),
+                                    ('customer', self.customer_gap)):
+      if not account_id in account_module.objectIds():
+        account = account_module.newContent(id=account_id)
+        account.setGap(account_gap)
+        portal.portal_workflow.doActionFor(account,
+            'validate_action', wf_id='account_workflow')
+
     vat_account = account_module['receivable_vat']
-    if not 'sale' in account_module.objectIds():
-      sale_account = account_module.newContent(id='sale')
-      sale_account.setGap(self.sale_gap)
-      portal.portal_workflow.doActionFor(sale_account,
-          'validate_action', wf_id='account_workflow')
     sale_account = account_module['sale']
-    if not 'customer' in account_module.objectIds():
-      customer_account = account_module.newContent(id='customer')
-      customer_account.setGap(self.customer_gap)
-      portal.portal_workflow.doActionFor(customer_account,
-          'validate_action', wf_id='account_workflow')
     customer_account = account_module['customer']
     
     invoice_rule = self.getPortal().portal_rules\
@@ -194,19 +202,16 @@ class TestInvoice(TestAccountingRulesMixin,
     cell_list = invoice_rule.getCellValueList(base_id='movement')
     self.assertEquals(len(cell_list),1)
     cell = cell_list[0]
-    income = cell.newContent(id='income',
-            portal_type=self.sale_invoice_transaction_portal_type)
-    income.setQuantity(1.0)
-    income.setSourceValue(sale_account)
-    receivable = cell.newContent(id='receivable',
-            portal_type=self.sale_invoice_transaction_portal_type)
-    receivable.setQuantity(-1.196)
-    receivable.setSourceValue(customer_account)
-    collected_vat = cell.newContent(id='collected_vat',
-            portal_type=self.sale_invoice_transaction_portal_type)
-    collected_vat.setQuantity(self.vat_rate)
-    collected_vat.setSourceValue(vat_account)
-    
+
+    for line_id, line_source, line_ratio in (('income', sale_account, 1.0),
+        ('receivable', customer_account, -1.0 - self.vat_rate),
+        ('collected_vat', vat_account, self.vat_rate)):
+
+      line = cell.newContent(id=line_id,
+          portal_type=self.sale_invoice_transaction_portal_type)
+      line.setQuantity(line_ratio)
+      line.setSourceValue(line_source)
+
   def modifyPackingListState(self, transition_name,
                              sequence,packing_list=None):
     """ calls the workflow for the packing list """
@@ -437,11 +442,11 @@ class TestInvoice(TestAccountingRulesMixin,
         simulation_movement_list = invoicing_rule.objectValues()
         self.assertNotEquals(len(simulation_movement_list), 0)
         for simulation_movement in simulation_movement_list :
-          resource = sequence.get('resource')
+          resource_list = sequence.get('resource_list')
           self.assertEquals(simulation_movement.getPortalType(),
                             'Simulation Movement')
-          self.assertEquals(simulation_movement.getResourceValue(),
-                            resource)
+          self.assertTrue(simulation_movement.getResourceValue() in
+              resource_list)
           # TODO: What is the invoice dates supposed to be ?
           # is this done through profiles ?
           self.assertEquals(simulation_movement.getStartDate(),
@@ -711,6 +716,40 @@ class TestInvoice(TestAccountingRulesMixin,
       stepCheckPackingListIsPacked
     """
       
+  # default sequence for two lines of not varianted resource.
+  PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE = """
+      stepCreateSaleInvoiceTransactionRule
+      stepCreateEntities
+      stepCreateCurrency
+      stepCreateOrder
+      stepSetOrderProfile
+      stepSetOrderPriceCurrency
+      stepCreateNotVariatedResource
+      stepTic
+      stepCreateOrderLine
+      stepSetOrderLineResource
+      stepSetOrderLineDefaultValues
+      stepCreateNotVariatedResource
+      stepTic
+      stepCreateOrderLine
+      stepSetOrderLineResource
+      stepSetOrderLineDefaultValues
+      stepOrderOrder
+      stepTic
+      stepCheckDeliveryBuilding
+      stepConfirmOrder
+      stepTic
+      stepCheckOrderRule
+      stepCheckOrderSimulation
+      stepCheckDeliveryBuilding
+      stepAddPackingListContainer
+      stepAddPackingListContainerLine
+      stepTic
+      stepSetContainerFullQuantity
+      stepTic
+      stepCheckPackingListIsPacked
+    """
+      
   # default sequence for one line of not varianted resource.
   TWO_PACKING_LIST_DEFAULT_SEQUENCE = """
       stepCreateSaleInvoiceTransactionRule
@@ -732,12 +771,12 @@ class TestInvoice(TestAccountingRulesMixin,
       stepCheckOrderRule
       stepCheckOrderSimulation
       stepCheckDeliveryBuilding
-      DecreasePackingListLineQuantity 
-      CheckPackingListIsCalculating 
-      SplitAndDeferPackingList 
-      Tic 
-      CheckPackingListIsSolved 
-      CheckPackingListSplitted
+      stepDecreasePackingListLineQuantity 
+      stepCheckPackingListIsCalculating 
+      stepSplitAndDeferPackingList 
+      stepTic 
+      stepCheckPackingListIsSolved 
+      stepCheckPackingListSplitted
       stepAddPackingListContainer
       stepAddPackingListContainerLine
       stepSetContainerLineFullQuantity
@@ -748,8 +787,9 @@ class TestInvoice(TestAccountingRulesMixin,
       stepCheckNewPackingListIsPacked
     """
 
-  def test_SimpleInvoice(self, quiet=0, run=RUN_ALL_TESTS):
+  def test_01_SimpleInvoice(self, quiet=0, run=RUN_ALL_TESTS):
     """Checks that a Simple Invoice is created from a Packing List"""
+    if not run: return
     for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
       self.playSequence(
         base_sequence +
@@ -763,7 +803,7 @@ class TestInvoice(TestAccountingRulesMixin,
         stepRebuildAndCheckNothingIsCreated
       """)
 
-  def test_TwoInvoicesFromTwoPackingList(self, quiet=0, run=1):
+  def test_02_TwoInvoicesFromTwoPackingList(self, quiet=0, run=RUN_ALL_TESTS):
     """ This test was created for the following bug:
         - an order is created and confirmed
         - the packing list is split
@@ -773,6 +813,7 @@ class TestInvoice(TestAccountingRulesMixin,
           so we have an invoice with twice the number of accounting rules
           and an invoice with no accounting rules. both invoices are wrong
     """
+    if not run: return
     for base_sequence in (TestInvoice.TWO_PACKING_LIST_DEFAULT_SEQUENCE, ) :
       self.playSequence(
         base_sequence +
@@ -790,17 +831,18 @@ class TestInvoice(TestAccountingRulesMixin,
         stepCheckTwoInvoicesTransactionLines
       """)
 
-  def test_InvoiceEditAndInvoiceRule(self, quiet=0, run=1):
+  def test_03_InvoiceEditAndInvoiceRule(self, quiet=0, run=RUN_ALL_TESTS):
     """Invoice Rule should not be applied on invoice lines created from\
     Packing List.
 
-    We went to prevent this from happening:
+    We want to prevent this from happening:
       - Create a packing list
       - An invoice is created from packing list
       - Invoice is edited, updateAppliedRule is called
       - A new Invoice Rule is created for this invoice, and accounting
         movements for this invoice are present twice in the simulation.
     """
+    if not run: return
     for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
       self.playSequence(
         base_sequence +
@@ -815,10 +857,11 @@ class TestInvoice(TestAccountingRulesMixin,
         stepCheckInvoiceRuleNotAppliedOnInvoiceEdit
       """)
   
-  def test_PackingListEditAndInvoiceRule(self, quiet=0, run=1):
+  def test_04_PackingListEditAndInvoiceRule(self, quiet=0, run=RUN_ALL_TESTS):
     """Delivery Rule should not be applied on packing list lines created\
     from Order.
     """
+    if not run: return
     for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
       self.playSequence(
         base_sequence +
@@ -827,9 +870,10 @@ class TestInvoice(TestAccountingRulesMixin,
         stepCheckDeliveryRuleNotAppliedOnPackingListEdit
       """)
 
-  def DISABLEDtest_InvoiceEditPackingListLine(self, quiet=0, run=RUN_ALL_TESTS):
+  def test_05_InvoiceEditPackingListLine(self, quiet=0, run=RUN_ALL_TESTS):
     """Checks that editing a Packing List Line still creates a correct
       Invoice"""
+    if not run: return
     for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
       self.playSequence(
         base_sequence +
@@ -844,12 +888,12 @@ class TestInvoice(TestAccountingRulesMixin,
       stepRebuildAndCheckNothingIsCreated
     """)
 
-  def DISABLEDtest_InvoiceDeletePackingListLine(self, quiet=0,
-                                                run=RUN_ALL_TESTS):
+  def test_06_InvoiceDeletePackingListLine(self, quiet=0,
+      run=RUN_ALL_TESTS):
     """Checks that deleting a Packing List Line still creates a correct
     Invoice"""
-    for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-                # XXX use another sequence that creates 2 lines
+    if not run: return
+    for base_sequence in (TestInvoice.PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE, ) :
       self.playSequence(
         base_sequence +
     """
@@ -863,15 +907,19 @@ class TestInvoice(TestAccountingRulesMixin,
       stepRebuildAndCheckNothingIsCreated
     """)
 
-  def DISABLEDtest_InvoiceAddPackingListLine(self, quiet=0, run=RUN_ALL_TESTS):
+  def test_07_InvoiceAddPackingListLine(self, quiet=0, run=RUN_ALL_TESTS):
     """Checks that adding a Packing List Line still creates a correct
     Invoice"""
-    for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE, ) :
+    if not run: return
+    for base_sequence in (TestInvoice.PACKING_LIST_DEFAULT_SEQUENCE,
+        TestInvoice.PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE) :
                 # XXX use another sequence that creates 2 lines
       self.playSequence(
         base_sequence +
     """
       stepAddPackingListLine
+      stepSetContainerFullQuantity
+      stepTic
       stepSetReadyPackingList
       stepTic
       stepStartPackingList
diff --git a/product/ERP5/tests/testOrder.py b/product/ERP5/tests/testOrder.py
index f50e3da5462614dc1fde9242f56b0473171bf67d..d49e5df1399d2a54589752a4af993718d30da8a7 100644
--- a/product/ERP5/tests/testOrder.py
+++ b/product/ERP5/tests/testOrder.py
@@ -82,13 +82,13 @@ class TestOrderMixin:
     """
     return ('erp5_base','erp5_pdm', 'erp5_trade', 'erp5_apparel',)
 
-  def login(self, quiet=0, run=run_all_test):
+  def login(self, quiet=0, run=1):
     uf = self.getPortal().acl_users
     uf._doAddUser('rc', '', ['Manager', 'Member'], [])
     user = uf.getUserById('rc').__of__(uf)
     newSecurityManager(None, user)
 
-  def afterSetUp(self, quiet=1, run=run_all_test):
+  def afterSetUp(self, quiet=1, run=1):
     self.login()
     portal = self.getPortal()
     self.category_tool = self.getCategoryTool()
diff --git a/product/ERP5/tests/testPackingList.py b/product/ERP5/tests/testPackingList.py
index dc5da5082e779127a3bf30aa7ea498d32c3c4c39..1fed90c3a6c5c00786dd64399d51593ba8993d81 100644
--- a/product/ERP5/tests/testPackingList.py
+++ b/product/ERP5/tests/testPackingList.py
@@ -312,7 +312,7 @@ class TestPackingListMixin(TestOrderMixin):
 
   def stepCheckSimulationDestinationUpdated(self,sequence=None, sequence_list=None, **kw):
     """
-      Create a empty organisation
+      XXX
     """
     applied_rule = sequence.get('applied_rule')
     simulation_line_list = applied_rule.objectValues()
@@ -323,14 +323,14 @@ class TestPackingListMixin(TestOrderMixin):
 
   def stepChangePackingListStartDate(self, sequence=None, sequence_list=None, **kw):
     """
-      Test if packing list is divergent
+      XXX
     """
     packing_list = sequence.get('packing_list')
     packing_list.edit(start_date=self.datetime + 15)
 
   def stepCheckSimulationStartDateUpdated(self,sequence=None, sequence_list=None, **kw):
     """
-      Create a empty organisation
+      XXX
     """
     applied_rule = sequence.get('applied_rule')
     simulation_line_list = applied_rule.objectValues()
@@ -338,14 +338,34 @@ class TestPackingListMixin(TestOrderMixin):
     for simulation_line in simulation_line_list:
       self.assertEquals(simulation_line.getStartDate(),self.datetime + 15)
 
+  def stepEditPackingListLine(self,sequence=None, sequence_list=None, **kw):
+    """
+      Edits a Packing List Line
+    """
+    packing_list_line = sequence.get('packing_list_line')
+    packing_list_line.edit(description='This line was edited!')
+
   def stepDeletePackingListLine(self,sequence=None, sequence_list=None, **kw):
     """
-      Create a empty organisation
+      Deletes a Packing List Line
     """
     packing_list = sequence.get('packing_list')
     packing_list_line_id = sequence.get('packing_list_line').getId()
     packing_list.manage_delObjects([packing_list_line_id])
 
+  def stepAddPackingListLine(self,sequence=None, sequence_list=None, **kw):
+    """
+      Adds a Packing List Line
+    """
+    packing_list = sequence.get('packing_list')
+    packing_list_line = packing_list.newContent(
+        portal_type=self.packing_list_line_portal_type)
+    self.stepCreateNotVariatedResource(sequence=sequence,
+        sequence_list=sequence_list, **kw)
+    resource = sequence.get('resource')
+    packing_list_line.setResourceValue(resource)
+    packing_list_line.edit(price=100, quantity=200)
+
   def stepCheckSimulationConnected(self,sequence=None, sequence_list=None, **kw):
     """
       Check if simulation movement are disconnected