diff --git a/product/ERP5/tests/testAccountingRules.py b/product/ERP5/tests/testAccountingRules.py
index 93913d33bbdf5ccd310fcdd773ae4cd5a2cd7b39..fba9f731a501ab0fdc35ad992e9fe72946ac1607 100755
--- a/product/ERP5/tests/testAccountingRules.py
+++ b/product/ERP5/tests/testAccountingRules.py
@@ -181,10 +181,10 @@ class TestAccountingRules(ERP5TypeTestCase):
     account_module.newContent(id='account3', title='Account3', portal_type='Account')
     account_module.newContent(id='account4', title='Account4', portal_type='Account')
     # Create some organisations
-    organisation1 = self.organisation_module.newContent(id='nexedi', title='Nexedi', portal_type='Organisation')
-    organisation1.newContent(id='default_address', portal_type='Address', region='europe/west/france')
-    organisation2 = self.organisation_module.newContent(id='client1', title='Client1', portal_type='Organisation')
-    organisation2.newContent(id='default_address', portal_type='Address', region='europe/west/france')
+    self.organisation1 = self.organisation_module.newContent(id='nexedi', title='Nexedi', portal_type='Organisation')
+    self.organisation1.newContent(id='default_address', portal_type='Address', region='europe/west/france')
+    self.organisation2 = self.organisation_module.newContent(id='client1', title='Client1', portal_type='Organisation')
+    self.organisation2.newContent(id='default_address', portal_type='Address', region='europe/west/france')
     # Create some products
     self.product1 = product_module.newContent(id='product1', title='Product1', product_line='storever/notebook', base_price=3.0)
     self.product2 = product_module.newContent(id='product2', title='Product2', product_line='storever/barebone', base_price=5.0)
@@ -194,8 +194,8 @@ class TestAccountingRules(ERP5TypeTestCase):
 
     self.predicate_product1 = self.invoice_transaction_rule.newContent(id='product_1', title='product_1', portal_type='Predicate Group', string_index='product', int_index='1', membership_criterion_base_category_list=['product_line',], membership_criterion_category_list=['product_line/storever/notebook'], immediate_reindex=1)
     self.predicate_product2 = self.invoice_transaction_rule.newContent(id='product_2', title='product_2', portal_type='Predicate Group', string_index='product', int_index='2', membership_criterion_base_category_list=['product_line',], membership_criterion_category_list=['product_line/storever/barebone'], immediate_reindex=1)
-    self.predicate_region1 = self.invoice_transaction_rule.newContent(id='region_1', title='region_1', portal_type='Predicate Group', string_index='region', int_index='1', membership_criterion_base_category_list=['region',], membership_criterion_category_list=['region/europe/west/france'], immediate_reindex=1)
-    self.predicate_region2 = self.invoice_transaction_rule.newContent(id='region_2', title='region_2', portal_type='Predicate Group', string_index='region', int_index='2', membership_criterion_base_category_list=['region',], membership_criterion_category_list=['region/africa'], immediate_reindex=1)
+    self.predicate_region1 = self.invoice_transaction_rule.newContent(id='region_1', title='region_1', portal_type='Predicate Group', string_index='region', int_index='1', membership_criterion_base_category_list=['destination_region',], membership_criterion_category_list=['destination_region/region/europe/west/france'], immediate_reindex=1)
+    self.predicate_region2 = self.invoice_transaction_rule.newContent(id='region_2', title='region_2', portal_type='Predicate Group', string_index='region', int_index='2', membership_criterion_base_category_list=['destination_region',], membership_criterion_category_list=['destination_region/region/africa'], immediate_reindex=1)
     # Create some invoices (now that there is nothing harmful inside the rule)
     self.invoice = self.accounting_module.newContent(id='invoice1', portal_type='Sale Invoice Transaction', destination='organisation/client1', destination_section='organisation/client1', resource='currency/EUR')
     invoice_line = self.invoice.newContent(id='1', portal_type='Invoice Line', resource='product/product1', quantity=7.0, price=11.0)
@@ -292,7 +292,7 @@ class TestAccountingRules(ERP5TypeTestCase):
     self.assertEqual(len(cell_list), 4)
 
 
-  def test_03_invoiceTransactionRule_getCellByPredicate(self, quiet=0, run=run_all_test):
+  def test_03_invoiceTransactionRule_getMatchingCell(self, quiet=0, run=run_all_test):
     """
     test InvoiceTransactionRule.getCellByPredicate()
     """
@@ -303,23 +303,26 @@ class TestAccountingRules(ERP5TypeTestCase):
       LOG('Testing... ',0,message)
     # before the tests, we must update the matrix
     self.updateInvoiceTransactionRuleMatrix()
-    # define objects
-    france = self.category_tool.restrictedTraverse('region/europe/west/france')
-    notebook = self.category_tool.restrictedTraverse('product_line/storever/notebook')
-    erp5 = self.category_tool.restrictedTraverse('product_line/erp5')
-    pcg = self.category_tool.restrictedTraverse('pcg/1')
+    from Products.ERP5Type.Document import newTempMovement    
+    movement = newTempMovement(self.invoice, 'test1', resource = 'product/product1',
+                                                      destination =  'organisation/nexedi')
+    # Make sure acquisition is working for destination_region
+    self.assertEqual(movement.getDestinationRegion(), 'region/europe/west/france')    
+    # Make sure category is working for destination_region
+    self.assertEqual(movement.getProductLine(), 'storever/notebook')    
+    # Test cell on movement
     # correct cell
-    kw = (('product', notebook), ('region', france), )
-    self.assertEqual(self.product1_region1_cell, self.invoice_transaction_rule.getCellByPredicate(*kw))
+    self.assertEqual(self.product1_region1_cell, self.invoice_transaction_rule._getMatchingCell(movement))
     # no predicate for this category
-    kw = (('product', erp5), ('region', france), )
-    self.assertEqual(None, self.invoice_transaction_rule.getCellByPredicate(*kw))
+    movement = newTempMovement(self.invoice, 'test2', resource = 'product/product2',
+                                                      destination = 'organisation/nexedi')
+    self.assertEqual(self.product2_region1_cell, self.invoice_transaction_rule._getMatchingCell(movement))
     # incorrect category
-    kw = (('product', None), ('region', france), )
-    self.assertEqual(None, self.invoice_transaction_rule.getCellByPredicate(*kw))
+    movement = newTempMovement(self.invoice, 'test3', product = None, destination = 'organisation/nexedi')
+    self.assertEqual(None, self.invoice_transaction_rule._getMatchingCell(movement))
     # incorrect dimension
-    kw = (('pcg', pcg), ('region', france), )
-    self.assertEqual(None, self.invoice_transaction_rule.getCellByPredicate(*kw))
+    movement = newTempMovement(self.invoice, 'test4', pcg = 'pcg/1', destination = 'organisation/nexedi')
+    self.assertEqual(None, self.invoice_transaction_rule._getMatchingCell(movement))
 
   def test_04_invoiceRule_expand(self, quiet=0, run=run_all_test):
     """
@@ -342,7 +345,7 @@ class TestAccountingRules(ERP5TypeTestCase):
 
     # flush activities
     get_transaction().commit()
-    self.tic()
+    self.tic()    
 
     LOG('history', 0, repr(( self.workflow_tool.getHistoryOf('edit_workflow', self.invoice) )))
 
@@ -358,11 +361,23 @@ class TestAccountingRules(ERP5TypeTestCase):
     movement_list = applied_rule.contentValues() # list of Invoice Lines
     self.assertEqual(len(movement_list), 1)
 
+    # Make sure the movement acquires all properties
     movement = movement_list[0]
     self.assertEqual(movement.getId(), '1')
     self.assertEqual(movement.getPortalType(), 'Simulation Movement')
     self.assertEqual(movement.getDelivery(), 'accounting/invoice1/1')
-
+    self.assertEqual(movement.getResource(), 'product/product1')
+    self.assertEqual(movement.getDestination(), 'organisation/client1')
+    self.assertEqual(movement.getDestinationSection(), 'organisation/client1')
+    self.assertEqual(movement.getProductLine(), 'storever/notebook')
+    self.assertEqual(movement.getDestinationRegion(), 'region/europe/west/france')
+
+    # Make sure the invoice_transaction_rule applies to this movement
+    self.assertEqual(self.invoice_transaction_rule.test(movement), True)
+    # And make sure the first cell applies
+    self.assertEqual(self.product1_region1_line1.test(movement), True)
+    
+    # Make sure expand succeeded
     sub_applied_rule_list = movement.contentValues() # list of Invoice Transaction Rules
     self.assertEqual(len(sub_applied_rule_list), 1)
 
@@ -440,6 +455,7 @@ class TestAccountingRules(ERP5TypeTestCase):
         self.assertEqual(sub_movement.getQuantity(), (7.0 * 11.0) * 19.0)
 
     # check if invoice transaction lines are added and correct (outside simulation too)
+    #self.invoice.buildInvoiceTransactionList()
     invoice_transaction_line = getattr(self.invoice, 'income', None)
     self.failIf(invoice_transaction_line is None)
     self.assertEqual(invoice_transaction_line.getPortalType(), 'Sale Invoice Transaction Line')
@@ -572,17 +588,22 @@ class TestAccountingRules(ERP5TypeTestCase):
           elif movement_id == '3' :
             self.assertEqual(sub_movement.getSource(), 'account/account3')
             self.assertEqual(sub_movement.getDestination(), 'account/account4')
-            self.assertEqual(sub_movement.getQuantity(), (23.0 * 29.0) * 31.0)
+            self.assertEqual(sub_movement.getQuantity(), (23.0 * 29.0) * 31.0)            
 
     # check if invoice transaction lines are added and correct (outside simulation too)
     invoice_transaction_line = getattr(self.invoice, 'income', None)
+    if invoice_transaction_line.getSource() != 'account/account1':
+      other_invoice_transaction_line = invoice_transaction_line
+      invoice_transaction_line = getattr(self.invoice, 'income_1', None)
+    else:
+      other_invoice_transaction_line = getattr(self.invoice, 'income_1', None)
     self.failIf(invoice_transaction_line is None)
     self.assertEqual(invoice_transaction_line.getPortalType(), 'Sale Invoice Transaction Line')
     self.assertEqual(invoice_transaction_line.getSource(), 'account/account1')
     self.assertEqual(invoice_transaction_line.getDestination(), 'account/account2')
     self.assertEqual(invoice_transaction_line.getQuantity(), (7.0 * 11.0 + 13.0 * 17.0) * 19.0)
 
-    invoice_transaction_line = getattr(self.invoice, 'income_1', None)
+    invoice_transaction_line = other_invoice_transaction_line
     self.failIf(invoice_transaction_line is None)
     self.assertEqual(invoice_transaction_line.getPortalType(), 'Sale Invoice Transaction Line')
     self.assertEqual(invoice_transaction_line.getSource(), 'account/account3')