diff --git a/product/ERP5/tests/testProductionOrder.py b/product/ERP5/tests/testProductionOrder.py
index 38ca16facc6948892bdf97ee9ac6e64f0f609cfd..ee0860c8c2021b6eef551e468e18a6a957feee72 100755
--- a/product/ERP5/tests/testProductionOrder.py
+++ b/product/ERP5/tests/testProductionOrder.py
@@ -174,6 +174,20 @@ class TestProductionOrder(TestOrderMixin, ERP5TypeTestCase):
     )
     sequence.edit(component1=resource)
 
+  def stepCreateComponent2(self,sequence=None, sequence_list=None, \
+                                    **kw):
+    """
+      Create a resource with no variation
+    """
+    portal = self.getPortal()
+    resource_module = portal.getDefaultModule(self.component_portal_type)
+    resource = resource_module.newContent(
+                                  portal_type=self.component_portal_type)
+    resource.edit(
+      title = "Component2"
+    )
+    sequence.edit(component2=resource)
+
   def stepCreateTransformation(self, sequence=None, sequence_list=None,
                                **kw):
     """
@@ -219,6 +233,15 @@ class TestProductionOrder(TestOrderMixin, ERP5TypeTestCase):
         resource_value=sequence.get('component1'),
         industrial_phase_list=['supply_phase1']
     )
+    # Create transformed resource line 2
+    line = transformation.newContent(
+        portal_type=self.transformed_resource_portal_type)
+    line.edit(
+        # FIXME hardcoded
+        quantity=7,
+        resource_value=sequence.get('component2'),
+        industrial_phase_list=['supply_phase2']
+    )
 
   def stepCreateOrder(self, sequence=None, sequence_list=None, **kw):
     """
@@ -563,11 +586,352 @@ class TestProductionOrder(TestOrderMixin, ERP5TypeTestCase):
     sequence_list.addSequenceString(sequence_string)
     sequence_list.play(self)
 
-  def test_02_testIndustrialPhase(self, quiet=0, run=run_all_test):
+  def stepCreateProductionOrganisation2(self, sequence=None, 
+                                        sequence_list=None, **kw):
+    """
+      Create a organisation for supply
+    """
+    self.stepCreateOrganisation(sequence=sequence, sequence_list=sequence_list,
+                                title='production_organisation2', **kw)
+
+  def stepCreateSupplyOrganisation2(self, sequence=None, sequence_list=None, 
+                                        **kw):
+    """
+      Create a organisation for supply
+    """
+    self.stepCreateOrganisation(sequence=sequence, sequence_list=sequence_list,
+                                title='supply_organisation2', **kw)
+
+  def stepCreateTwoPhasesSC(self, sequence=None, sequence_list=None, 
+                             **kw):
+    """
+      Create a empty organisation
+    """
+    # Create supply chain
+    self.stepCreateSourcingSC(sequence=sequence, sequence_list=sequence_list,
+                              **kw)
+    supply_chain = sequence.get('supply_chain')
+    # Create production node
+    production_organisation2  = sequence.get('production_organisation2')
+    production_node2 = supply_chain.newContent(
+                         portal_type=self.supply_node_portal_type)
+    production_node2.edit(
+      destination_value=production_organisation2
+    )
+    sequence.edit(production_node2=production_node2)
+    # Create production link
+    production_link2 = supply_chain.newContent(
+                         portal_type=self.supply_link_portal_type)
+    production_link2.edit(
+      destination_value=production_node2,
+      min_delay=5,
+      max_delay=6,
+      deliverable=0,
+      industrial_phase_list=["phase2"]
+    )
+    # Link production_node2 and production_node1
+    supply_link = supply_chain.newContent(
+                         portal_type=self.supply_link_portal_type)
+    production_node1 = sequence.get('production_node1')
+    supply_link.edit(
+      source_value=production_node2,
+      destination_value=production_node1,
+      min_delay=5,
+      max_delay=6,
+      deliverable=0,
+      industrial_phase_list=[]
+    )
+    # Create supply node
+    supply_organisation2  = sequence.get('supply_organisation2')
+    supply_node2 = supply_chain.newContent(
+                         portal_type=self.supply_node_portal_type)
+    supply_node2.edit(
+      destination_value=supply_organisation2
+    )
+    # Create sourcing link
+    supply_link2 = supply_chain.newContent(
+                         portal_type=self.supply_link_portal_type)
+    supply_link2.edit(
+      source_value=supply_node2,
+      destination_value=production_node2,
+      min_delay=5,
+      max_delay=6,
+      deliverable=0,
+      industrial_phase_list=["supply_phase2"]
+    )
+
+  def stepCheckTwoPhasesSimulation(self, sequence=None, sequence_list=None,
+                                   **kw):
+    """
+      Hardcoded check
+    """
+#     self.stepCheckSourcingSimulation(sequence=sequence,
+#                                      sequence_list=sequence_list, **kw)
+    self.stepCheckOrderSimulation(sequence=sequence,
+                                  sequence_list=sequence_list, **kw)
+    # Test simulation movement generated related to order line
+    simulation_movement_list = sequence.get('simulation_movement_list')
+    self.assertEquals(1, len(simulation_movement_list))
+    order_line = sequence.get('order_line')
+    related_simulation_movement_list = order_line.getOrderRelatedValueList()
+    self.assertEquals(1, len(related_simulation_movement_list))
+    related_simulation_movement = related_simulation_movement_list[0]
+    self.assertEquals(related_simulation_movement,
+                      simulation_movement_list[0])
+    production_organisation1 = sequence.get('production_organisation1')
+    # XXX FIXME test date
+    self.checkObjectAttributes(
+           related_simulation_movement, (
+             (order_line.getQuantity(), 'getQuantity'),
+             (order_line.getResourceValue(), 'getResourceValue'),
+             (order_line.getVariationCategoryList(), 
+              'getVariationCategoryList'),
+             (order_line.getDestinationValue(), 'getDestinationValue'),
+             (order_line.getDestinationSectionValue(), 
+              'getDestinationSectionValue'),
+             (production_organisation1, 'getSourceValue'),
+             (production_organisation1, 'getSourceSectionValue')))
+    # Test next applied rule
+    applied_rule_list = related_simulation_movement.objectValues()
+    self.assertEquals(1, len(applied_rule_list))
+    applied_rule = applied_rule_list[0]
+    self.assertEquals("Applied Rule", applied_rule.getPortalType())
+    portal_rules = getToolByName(applied_rule, 'portal_rules')
+    self.assertEquals(portal_rules.default_transformation_rule, \
+                      applied_rule.getSpecialiseValue())
+    # Test deeper simulation 
+    simulation_movement_list = list(applied_rule.objectValues())
+    # FIXME
+    self.assertEquals(4, len(simulation_movement_list))
+    # Test produced resource
+    produced_movement = applied_rule.pr
+    resource = sequence.get('resource')
+    production_organisation1 = sequence.get('production_organisation1')
+    self.checkObjectAttributes(
+           produced_movement, (
+             (5, 'getQuantity'),
+             (resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (production_organisation1, 'getDestinationValue'),
+             (production_organisation1, 'getDestinationSectionValue'),
+             (None, 'getSourceValue'),
+             (None, 'getSourceSectionValue')))
+    self.assertEquals(0, len(produced_movement.objectValues()))
+
+    # Get modified resource (test later)
+    modified_movement = applied_rule.mr_1
+    simulation_movement_list.remove(produced_movement)
+    simulation_movement_list.remove(modified_movement)
+    # All code before is a stupid copy (except movement count)
+    # Test consumed movement
+    operation_resource = resource.portal_categories.resolveCategory(
+                                              'operation/operation1')
+    component_resource = sequence.get('component1')
+#     for consumed_movement in (applied_rule.cr_1, applied_rule.cr_2):
+    for consumed_movement in simulation_movement_list:
+      if consumed_movement.getResourceValue() == operation_resource:
+        operation_movement = consumed_movement
+      else:
+        component_movement = consumed_movement
+    # Check operation movement
+    self.checkObjectAttributes(
+           operation_movement, (
+             (10, 'getQuantity'),
+             (operation_resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (None, 'getDestinationValue'),
+             (None, 'getDestinationSectionValue'),
+             (production_organisation1, 'getSourceValue'),
+             (production_organisation1, 'getSourceSectionValue')))
+    self.assertEquals(0, len(operation_movement.objectValues()))
+    # Check component movement
+    self.checkObjectAttributes(
+           component_movement, (
+             (30, 'getQuantity'),
+             (component_resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (None, 'getDestinationValue'),
+             (None, 'getDestinationSectionValue'),
+             (production_organisation1, 'getSourceValue'),
+             (production_organisation1, 'getSourceSectionValue')))
+    self.assertEquals(1, len(component_movement.objectValues()))
+    # Test supply applied rule
+    applied_rule = component_movement.objectValues()[0]
+    self.assertEquals("Applied Rule", applied_rule.getPortalType())
+    portal_rules = getToolByName(applied_rule, 'portal_rules')
+    self.assertEquals(portal_rules.default_transformation_sourcing_rule, \
+                      applied_rule.getSpecialiseValue())
+    # Test supply movement
+    simulation_movement_list = applied_rule.objectValues()
+    # FIXME
+    self.assertEquals(1, len(simulation_movement_list))
+    # Test supply resource
+    supply_movement = applied_rule.ts
+    supply_organisation1 = sequence.get('supply_organisation1')
+    self.checkObjectAttributes(
+           supply_movement, (
+             (30, 'getQuantity'),
+             (component_resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (production_organisation1, 'getDestinationValue'),
+             (production_organisation1, 'getDestinationSectionValue'),
+             (supply_organisation1, 'getSourceValue'),
+             (supply_organisation1, 'getSourceSectionValue')))
+    self.assertEquals(0, len(supply_movement.objectValues()))
+
+    # Test modified movement
+    resource = sequence.get('resource')
+    production_organisation1 = sequence.get('production_organisation1')
+    self.checkObjectAttributes(
+           modified_movement, (
+             (5, 'getQuantity'),
+             (resource, 'getResourceValue'),
+             (['industrial_phase/phase2'], 'getVariationCategoryList'),
+             (production_organisation1, 'getSourceValue'),
+             (production_organisation1, 'getSourceSectionValue'),
+             (None, 'getDestinationValue'),
+             (None, 'getDestinationSectionValue')))
+    self.assertEquals(1, len(modified_movement.objectValues()))
+    # Test next applied rule
+    applied_rule_list = modified_movement.objectValues()
+    applied_rule = applied_rule_list[0]
+    self.assertEquals("Applied Rule", applied_rule.getPortalType())
+    portal_rules = getToolByName(applied_rule, 'portal_rules')
+    self.assertEquals(portal_rules.default_transformation_sourcing_rule, \
+                      applied_rule.getSpecialiseValue())
+    # Test deeper simulation 
+    simulation_movement_list = list(applied_rule.objectValues())
+    self.assertEquals(1, len(simulation_movement_list))
+    # Test produced resource
+    sourcing_movement = simulation_movement_list[0]
+    resource = sequence.get('resource')
+    production_organisation1 = sequence.get('production_organisation1')
+    production_organisation2 = sequence.get('production_organisation2')
+    self.checkObjectAttributes(
+           sourcing_movement, (
+             (5, 'getQuantity'),
+             (resource, 'getResourceValue'),
+             (['industrial_phase/phase2'], 'getVariationCategoryList'),
+             (production_organisation1, 'getDestinationValue'),
+# XXX             (production_organisation1, 'getDestinationSectionValue'),
+             (production_organisation2, 'getSourceValue'),
+# XXX             (production_organisation2, 'getSourceSectionValue')))
+           ))
+    self.assertEquals(1, len(sourcing_movement.objectValues()))
+    # Test next applied rule
+    applied_rule_list = sourcing_movement.objectValues()
+    self.assertEquals(1, len(applied_rule_list))
+    applied_rule = applied_rule_list[0]
+    self.assertEquals("Applied Rule", applied_rule.getPortalType())
+    portal_rules = getToolByName(applied_rule, 'portal_rules')
+    self.assertEquals(portal_rules.default_transformation_rule, \
+                      applied_rule.getSpecialiseValue())
+    # Test deeper simulation 
+    simulation_movement_list = list(applied_rule.objectValues())
+    # FIXME
+    self.assertEquals(3, len(simulation_movement_list))
+    # Test produced resource
+    produced_movement = applied_rule.pr
+    resource = sequence.get('resource')
+    production_organisation2 = sequence.get('production_organisation2')
+    self.checkObjectAttributes(
+           produced_movement, (
+             (5, 'getQuantity'),
+             (resource, 'getResourceValue'),
+             (['industrial_phase/phase2'], 'getVariationCategoryList'),
+             (production_organisation2, 'getDestinationValue'),
+# XXX             (production_organisation2, 'getDestinationSectionValue'),
+             (None, 'getSourceValue'),
+             (None, 'getSourceSectionValue')))
+    self.assertEquals(0, len(produced_movement.objectValues()))
+
+    simulation_movement_list.remove(produced_movement)
+    # All code before is a stupid copy (except movement count)
+    # Test consumed movement
+    operation_resource = resource.portal_categories.resolveCategory(
+                                              'operation/operation2')
+    component_resource = sequence.get('component2')
+    for consumed_movement in simulation_movement_list:
+      if consumed_movement.getResourceValue() == operation_resource:
+        operation_movement = consumed_movement
+      else:
+        component_movement = consumed_movement
+    # Check operation movement
+    self.checkObjectAttributes(
+           operation_movement, (
+             (15, 'getQuantity'),
+             (operation_resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (None, 'getDestinationValue'),
+             (None, 'getDestinationSectionValue'),
+             (production_organisation2, 'getSourceValue'),
+# XXX              (production_organisation2, 'getSourceSectionValue')))
+           ))
+    self.assertEquals(0, len(operation_movement.objectValues()))
+    # Check component movement
+    self.checkObjectAttributes(
+           component_movement, (
+             (35, 'getQuantity'),
+             (component_resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (None, 'getDestinationValue'),
+             (None, 'getDestinationSectionValue'),
+             (production_organisation2, 'getSourceValue'),
+# XXX              (production_organisation2, 'getSourceSectionValue')))
+           ))
+    self.assertEquals(1, len(component_movement.objectValues()))
+    # Test supply applied rule
+    applied_rule = component_movement.objectValues()[0]
+    self.assertEquals("Applied Rule", applied_rule.getPortalType())
+    portal_rules = getToolByName(applied_rule, 'portal_rules')
+    self.assertEquals(portal_rules.default_transformation_sourcing_rule, \
+                      applied_rule.getSpecialiseValue())
+    # Test supply movement
+    simulation_movement_list = applied_rule.objectValues()
+    # FIXME
+    self.assertEquals(1, len(simulation_movement_list))
+    # Test supply resource
+    supply_movement = applied_rule.ts
+    supply_organisation2  = sequence.get('supply_organisation2')
+    self.checkObjectAttributes(
+           supply_movement, (
+             (35, 'getQuantity'),
+             (component_resource, 'getResourceValue'),
+             ([], 'getVariationCategoryList'),
+             (production_organisation2, 'getDestinationValue'),
+# XXX              (production_organisation2, 'getDestinationSectionValue'),
+             (supply_organisation2, 'getSourceValue'),
+# XXX              (supply_organisation2, 'getSourceSectionValue')))
+           ))
+    self.assertEquals(0, len(supply_movement.objectValues()))
+
+    
+  def test_03_testIndustrialPhase(self, quiet=0, run=run_all_test):
     """
     """
-    # XXX to be written
-    pass
+    if not run: return
+    sequence_list = SequenceList()
+    # Test when order is 
+    sequence_string = '\
+                      CreateProductionOrganisation1 \
+                      CreateProductionOrganisation2 \
+                      CreateSupplyOrganisation1 \
+                      CreateSupplyOrganisation2 \
+                      CreateTwoPhasesSC \
+                      CreateVariatedResource \
+                      CreateComponent1 \
+                      CreateComponent2 \
+                      CreateTransformation \
+                      CreateOrganisation \
+                      CreateOrder \
+                      CreateOrderLine \
+                      Tic \
+                      OrderOrder \
+                      Tic \
+                      CheckTwoPhasesSimulation \
+                      '
+    sequence_list.addSequenceString(sequence_string)
+    sequence_list.play(self)
 
 if __name__ == '__main__':
     framework()