diff --git a/product/ERP5Type/tests/Sequence.py b/product/ERP5Type/tests/Sequence.py
index f5e7077d8f796c4d22e8772192d2f1dbba8e52e8..14df27449704d6d194dbfe89a9712eccd40a512c 100644
--- a/product/ERP5Type/tests/Sequence.py
+++ b/product/ERP5Type/tests/Sequence.py
@@ -97,19 +97,23 @@ class Step:
 
 class Sequence:
 
-  def __init__(self):
+  def __init__(self, context=None):
     self._step_list = []
     self._dict = {}
+    self._played_index = 0
+    self._context = context
 
   def play(self, context, sequence=None, sequence_number=0, quiet=0):
     if not quiet:
-      ZopeTestCase._print('\nStarting New Sequence %i... ' % sequence_number)
-      LOG('Sequence.play', 0, 'Starting New Sequence %i... ' % sequence_number)
+      if self._played_index == 0:
+        ZopeTestCase._print('\nStarting New Sequence %i... ' % sequence_number)
+        LOG('Sequence.play', 0, 'Starting New Sequence %i... ' % sequence_number)
     if sequence is None:
-      for idx, step in enumerate(self._step_list):
+      for idx, step in enumerate(self._step_list[self._played_index:]):
         step.play(context, sequence=self, quiet=quiet)
         # commit transaction after each step
         transaction.commit()
+      self._played_index = len(self._step_list)
 
   def addStep(self,method_name,required=1,max_replay=1):
     new_step = Step(method_name=method_name,
@@ -128,6 +132,32 @@ class Sequence:
   def setdefault(self, key, default=None):
     return self._dict.setdefault(key, default)
 
+  def __call__(self, sequence_string, sequence_number=0, quiet=0):
+    """
+    add some steps and directly runs them, this allows to easily write
+    such code when sequence are unable to handle too complex cases :
+
+      sequence('CreateFoo Tic')
+      [some code not using sequences]
+      sequence('CreateBar Tic')
+    """
+    self.setSequenceString(sequence_string)
+    if self._context is None:
+      raise ValueError('context must be initialized when sequence directly called')
+    self.play(self._context, sequence_number=sequence_number, quiet=quiet)
+
+  def setSequenceString(self, sequence_string):
+    sequence_string = re.subn("#.*\n", "\n", sequence_string)[0]
+    step_list = sequence_string.split()
+    self.setSequenceStringList(step_list)
+
+  def setSequenceStringList(self, step_list):
+    for step in step_list:
+      if step != '':
+        if step.startswith('step'):
+          step = step[4:]
+        self.addStep(step)
+
 class SequenceList:
 
   def __init__(self):
@@ -144,18 +174,14 @@ class SequenceList:
     returns the sequence for those steps.
     """
     # remove comments in sequence strings
-    sequence_string = re.subn("#.*\n", "\n", sequence_string)[0]
-    step_list = sequence_string.split()
-    return self.addSequenceStringList(step_list)
+    sequence = Sequence()
+    sequence.setSequenceString(sequence_string)
+    self.addSequence(sequence)
+    return sequence
 
   def addSequenceStringList(self, step_list):
-    step_list
     sequence = Sequence()
-    for step in step_list:
-      if step != '':
-        if step.startswith('step'):
-          step = step[4:]
-        sequence.addStep(step)
+    sequence.setSequenceStringList(step_list)
     self.addSequence(sequence)
     return sequence