anchor.diff:    bool start = false;
     bool finish = false;
   
  +  List<Future> guardians;
  +  
     Dynamic error;
     String errorMessage;
     Dynamic trace;
     
  -  TestPiece.describe(this.description, this._test, [this.parent = null]): _describe = true, ignore = false, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>();
  -  TestPiece.it(this.description, this._test, [this.parent = null]): _describe = false, ignore = false, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>();
  -
  -  TestPiece.xdescribe(this.description, this._test, [this.parent = null]): _describe = true, ignore = true, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>();
  -  TestPiece.xit(this.description, this._test, [this.parent = null]): _describe = false, ignore = true, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>();
  +  TestPiece.describe(this.description, this._test, [this.parent = null]): _describe = true, ignore = false, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>(), guardians = new List<Future>();
  +  TestPiece.it(this.description, this._test, [this.parent = null]): _describe = false, ignore = false, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>(), guardians = new List<Future>();
  +
  +  TestPiece.xdescribe(this.description, this._test, [this.parent = null]): _describe = true, ignore = true, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>(), guardians = new List<Future>();
  +  TestPiece.xit(this.description, this._test, [this.parent = null]): _describe = false, ignore = true, tests = new List<TestPiece>(), beforeEach = new List<Task>(), afterEach = new List<Task>(), guardians = new List<Future>();
   
     bool isSuite() => _describe;
     bool isSpec() => !_describe;
     
  -  void run(){
  +  void run(final Task nextTask){
  +    if(ignore){
  +      start = true;
  +      finish = true;
  +      nextTask();
  +      return;
  +    }
  +
       TeaoliveRunner runner = _environment.runner;
  -    TestPiece pre = runner.currentRunning;
  +    TestPiece restore = runner.currentRunning;
       runner.currentRunning = this;
  +
  +    start = true;
  +    
       try{
  -      start = true;
  -      if(ignore){
  -        finish = true;
  -        return;
  +      if(isSpec()){
  +        List<Task> _beforeEach = _collectBeforeTask();
  +        for(Task beforeTask in _beforeEach){
  +          beforeTask();
  +        }
         }
         _test();
  -      for(TestPiece piece in tests){
  -        for(Task beforeTask in beforeEach){
  -          beforeTask();
  -        }
  -        piece.run();
  -        for(Task afterTask in afterEach){
  +      if(isSpec()){
  +        List<Task> _afterEach = _collectAfterTask();
  +        for(Task afterTask in _afterEach){
             afterTask();
           }
         }
  -      finish = true;
  -      result = true;
  -
  -      List<TestPiece> fullset = new List<TestPiece>();
  -      fullset.add(this);
  -      fullset.addAll(tests);
  -      for(TestPiece piece in fullset){
  -        if(piece.start && piece.finish && piece.result){
  -          continue;
  -        } else if(piece.ignore){
  -          continue;
  -        }
  -        result = false;
  -      }
       } catch(AssertionException e, Dynamic _trace) {
  -      errorMessage = e.msg;
  -      error = e;
  -      trace = _trace;
  +      _run_exception(e, _trace);
  +      nextTask();
         return;
       } catch(var e, Dynamic _trace) {
  -      error = e;
  -      trace = _trace;
  +      _run_exception(e, _trace);
  +      nextTask();
         return;
  -    } finally {
  -      runner.currentRunning = pre;
  -      finish = true;
  -    }
  +    }
  +
  +    Futures.wait(guardians).then((var v){
  +      _run(restore, nextTask);
  +    });
  +  }
  +  
  +  void _run(final TestPiece restore, final Task nextTask){
  +    for(TestPiece piece in tests){
  +      if(piece.start || piece.finish){
  +        continue;
  +      }
  +      
  +      Completer<Dynamic> completer = new Completer();
  +      completer.future.handleException(_run_exception);
  +      completer.future
  +      .chain((var v){
  +        return Futures.wait(guardians);
  +      })
  +      .then((var v){
  +        _run(restore, nextTask);
  +      });
  +      piece.run((){
  +        completer.complete(null);
  +      });
  +      return;
  +    }
  +    _run_finish(restore, nextTask);
  +  }
  +  
  +  bool _run_exception(Dynamic e, [Dynamic _trace]){
  +    if(e is AssertionException){
  +      errorMessage = e.msg;
  +    }
  +    error = e;
  +    trace = _trace;
  +    result = false;
  +    finish = true;
  +    return true;
  +  }
  +  
  +  void _run_finish(TestPiece restore, Task nextTask){
  +    finish = true;
  +    result = true;
  +
  +    List<TestPiece> fullset = new List<TestPiece>();
  +    fullset.add(this);
  +    fullset.addAll(tests);
  +    for(TestPiece piece in fullset){
  +      if(piece.start && piece.finish && piece.result){
  +        continue;
  +      } else if(piece.ignore){
  +        continue;
  +      }
  +      result = false;
  +    }
  +
  +    _environment.runner.currentRunning = restore;
  +    nextTask();
     }
     
     void add(TestPiece piece){
  
positive.code: 
  #library('teaolive');
  
  #import('reporter/teaolive_text_reporter.dart');
  
  /** Task. Represent an action, such as testing and cleanup. */
  
negative.code:     }
    }
    
    List<Task> _collectBeforeTask([TestPiece piece, List<Task> tasks]){
      if(parent == null){
        return new List<Task>();
      }
      if(piece == null){
        piece = parent;
      }
      if(tasks == null){
        tasks = new List<Task>();
      }
      if(piece.parent != null){
        _collectBeforeTask(piece.parent, tasks);
      }
  