diff --git a/product/ERP5/tests/testBPMCore.py b/product/ERP5/tests/testBPMCore.py
index 62fc8fe740ae2a00825f6573a145fc35732fbeb0..ee9fb3abf556c89c983422706f8f25b64dea52fb 100644
--- a/product/ERP5/tests/testBPMCore.py
+++ b/product/ERP5/tests/testBPMCore.py
@@ -560,62 +560,61 @@ class TestBPMisBuildableImplementation(TestBPMDummyDeliveryMovementMixin):
     order = self._createDelivery()
     order_line = self._createMovement(order)
 
+
     # first level rule with simulation movement
     applied_rule = self.portal.portal_simulation.newContent(
         portal_type='Applied Rule', causality_value=order)
 
-    simulation_movement = applied_rule.newContent(
-      portal_type = 'Simulation Movement',
-      delivery_value = order_line,
-      causality_value = self.order_link
-    )
-
-    # second level rule with simulation movement
-    delivery_rule = simulation_movement.newContent(
-        portal_type='Applied Rule')
-    delivery_simulation_movement = delivery_rule.newContent(
+    def setTestClassProperty(prefix, property_name, document):
+      if prefix:
+        property_name = "%s_%s" % (prefix, property_name)
+      setattr(self, property_name, document)
+      return document
+
+    def constructSimulationTree(applied_rule, prefix=None):
+      document = setTestClassProperty(prefix, 'simulation_movement',
+        applied_rule.newContent(
+        portal_type = 'Simulation Movement',
+        delivery_value = order_line,
+        causality_value = self.order_link
+        ))
+
+      # second level rule with simulation movement
+      document = setTestClassProperty(prefix, 'delivery_rule',
+        document.newContent(
+        portal_type='Applied Rule'))
+      document = setTestClassProperty(prefix, 'delivery_simulation_movement',
+        document.newContent(
         portal_type='Simulation Movement',
-        causality_value = self.delivery_link)
-
-    # third level rule with simulation movement
-    invoicing_rule = delivery_simulation_movement.newContent(
-        portal_type='Applied Rule')
-    invoicing_simulation_movement = invoicing_rule.newContent(
-        portal_type='Simulation Movement',
-        causality_value = self.invoice_link)
-
-    # split simulation movement for first level applied rule
-    split_simulation_movement = applied_rule.newContent(
-      portal_type = 'Simulation Movement', delivery_value = order_line,
-      causality_value = self.order_link)
+        causality_value = self.delivery_link))
 
-    # second level rule with simulation movement for split parent movement
-    split_delivery_rule = split_simulation_movement.newContent(
-        portal_type='Applied Rule')
-    split_delivery_simulation_movement = split_delivery_rule.newContent(
-        portal_type='Simulation Movement',
-        causality_value = self.delivery_link)
+      # third level rule with simulation movement
+      document = setTestClassProperty(prefix, 'invoicing_rule',
+          document.newContent(
+          portal_type='Applied Rule'))
+      document = setTestClassProperty(prefix, 'invoicing_simulation_movement',
+          document.newContent(
+          portal_type='Simulation Movement',
+          causality_value = self.invoice_link))
 
-    # third level rule with simulation movement for split parent movement
-    split_invoicing_rule = split_delivery_simulation_movement.newContent(
-        portal_type='Applied Rule')
-    split_invoicing_simulation_movement = split_invoicing_rule.newContent(
-        portal_type='Simulation Movement',
-        causality_value = self.invoice_link)
+    constructSimulationTree(applied_rule)
+    constructSimulationTree(applied_rule, prefix='split')
 
     order.setSimulationState(self.completed_state)
     self.stepTic()
 
+    def checkIsBusinessLinkBuildable(explanation, business_link, value):
+      self.assertEquals(self.business_process.isBusinessLinkBuildable(
+       explanation, business_link), value)
+
     # in the beginning only order related movements shall be buildable
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       order, self.delivery_link), True)
-    self.assertEquals(delivery_simulation_movement.isBuildable(), True)
-    self.assertEquals(split_delivery_simulation_movement.isBuildable(), True)
+    checkIsBusinessLinkBuildable(order, self.delivery_link, True)
+    self.assertEquals(self.delivery_simulation_movement.isBuildable(), True)
+    self.assertEquals(self.split_delivery_simulation_movement.isBuildable(), True)
 
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       order, self.invoice_link), False)
-    self.assertEquals(invoicing_simulation_movement.isBuildable(), False)
-    self.assertEquals(split_invoicing_simulation_movement.isBuildable(),
+    checkIsBusinessLinkBuildable(order, self.invoice_link, False)
+    self.assertEquals(self.invoicing_simulation_movement.isBuildable(), False)
+    self.assertEquals(self.split_invoicing_simulation_movement.isBuildable(),
         False)
 
     # add delivery
@@ -623,7 +622,7 @@ class TestBPMisBuildableImplementation(TestBPMDummyDeliveryMovementMixin):
     delivery_line = self._createMovement(delivery)
 
     # relate not split movement with delivery (deliver it)
-    delivery_simulation_movement.edit(delivery_value = delivery_line)
+    self.delivery_simulation_movement.edit(delivery_value = delivery_line)
 
     self.stepTic()
 
@@ -635,20 +634,15 @@ class TestBPMisBuildableImplementation(TestBPMDummyDeliveryMovementMixin):
     #
     # delivery_link (for delivery) is not buildable - delivery is already
     # built for those movements
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       order, self.delivery_link), True)
-    self.assertEquals(split_delivery_simulation_movement.isBuildable(), True)
-
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       delivery, self.delivery_link), False)
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       delivery, self.invoice_link), False)
-    self.assertEquals(delivery_simulation_movement.isBuildable(), False)
-    self.assertEquals(invoicing_simulation_movement.isBuildable(), False)
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       order, self.invoice_link), False)
-    self.assertEquals(split_invoicing_simulation_movement.isBuildable(),
-        False)
+    checkIsBusinessLinkBuildable(order, self.delivery_link, True)
+    self.assertEquals(self.split_delivery_simulation_movement.isBuildable(), True)
+
+    checkIsBusinessLinkBuildable(delivery, self.delivery_link, False)
+    checkIsBusinessLinkBuildable(delivery, self.invoice_link, False)
+    self.assertEquals(self.delivery_simulation_movement.isBuildable(), False)
+    self.assertEquals(self.invoicing_simulation_movement.isBuildable(), False)
+    checkIsBusinessLinkBuildable(order, self.invoice_link, False)
+    self.assertEquals(self.split_invoicing_simulation_movement.isBuildable(), False)
 
     # put delivery in simulation state configured on path (and this state is
     # available directly on movements)
@@ -669,20 +663,15 @@ class TestBPMisBuildableImplementation(TestBPMDummyDeliveryMovementMixin):
     #
     # split movement for invoicing is not buildable - no proper delivery
     # related for previous path
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       order, self.delivery_link), True)
-    self.assertEquals(invoicing_simulation_movement.isBuildable(), True)
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       delivery, self.invoice_link), True)
-
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       order, self.invoice_link), False)
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       delivery, self.invoice_link), True)
-    self.assertEquals(self.business_process.isBusinessLinkBuildable(
-       delivery, self.delivery_link), False)
-    self.assertEquals(delivery_simulation_movement.isBuildable(), False)
-    self.assertEquals(split_invoicing_simulation_movement.isBuildable(),
+    checkIsBusinessLinkBuildable(order, self.delivery_link, True)
+    self.assertEquals(self.invoicing_simulation_movement.isBuildable(), True)
+    checkIsBusinessLinkBuildable(delivery, self.invoice_link, True)
+
+    checkIsBusinessLinkBuildable(order, self.invoice_link, False)
+    checkIsBusinessLinkBuildable(delivery, self.invoice_link, True)
+    checkIsBusinessLinkBuildable(delivery, self.delivery_link, False)
+    self.assertEquals(self.delivery_simulation_movement.isBuildable(), False)
+    self.assertEquals(self.split_invoicing_simulation_movement.isBuildable(),
         False)
 
   @newSimulationExpectedFailure