        } else if (sizeof(xp::registry('errors')) > 0) {
 -        $this->notifyListeners('testFailed', array(
 -          $result->setFailed($test, new AssertionFailedError('Errors', '<Non-clean error stack>', '<no errors>'), $timer->elapsedTime())
++        $w= array();
++        foreach (xp::registry('errors') as $file => $lookup) {
++          foreach ($lookup as $line => $messages) {
++            foreach ($messages as $message => $detail) {
++              $w[]= sprintf(
++                '"%s" in %s::%s() (%s, line %d, occured %s)',
++                $message,
++                $detail['class'],
++                $detail['method'],
++                basename($file),
++                $line,
++                1 === $detail['cnt'] ? 'once' : $detail['cnt'].' times'
++              );
++            }
++          }
++        }
 +        $this->notifyListeners('testError', array(
-+          $result->setFailed(
-+            $test, 
-+            new AssertionFailedError('Errors', '<Non-clean error stack>', '<no errors>'), 
-+            $timer->elapsedTime()
-+          )
++          $result->set($test, new TestWarning($test, $w, $timer->elapsedTime()))
          ));
        } else if ($eta && $timer->elapsedTime() > $eta) {
          $this->notifyListeners('testFailed', array(

       }
       
       // Check for @limit
@@ -219,28 +227,44 @@
         $e= $t->getCause();
 
         // Was that an expected exception?

           ));
+        } else {
+          $this->notifyListeners('testError', array(
+            $result->set($test, new TestError($test, $e, $timer->elapsedTime()))
+          ));
         }
         xp::gc();
         return;
@@ -254,17 +281,37 @@
         $this->notifyListeners('testFailed', array(
           $result->setFailed(
             $test, 
