Merge branch 'stable'
diff --git a/.status b/.status
index e659275..ddb02ed 100644
--- a/.status
+++ b/.status
@@ -14,14 +14,5 @@
 # difference between transformed an untransformed code.
 test/*: Skip
 
-[ $compiler == dart2js && $minified ]
-# The unminified matcher tests test that the real names of Dart types are
-# printed. Minified versions of these tests exist that test the behavior when
-# minified.
-*_unminified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
-
-[ $minified == false ]
-# The minified matcher tests test that the minified names of Dart types are
-# printed. Unminified versions of these tests exist that test the behavior when
-# not minified.
-build/test/*_minified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
+[ $browser ]
+*: RuntimeError # new unittest package does not support browser tests
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ee00a46..13aa2a9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.12.0
+
+* Moved a number of members to the
+  [`unittest`](https://pub.dartlang.org/packages/unittest) package.
+  * `TestFailure`, `ErrorFormatter`, `expect`, `fail`, and 'wrapAsync'.
+  * `completes`, `completion`, `throws`, and `throwsA` Matchers.
+  * The `Throws` class.
+  * All of the `throws...Error` Matchers.
+
+* Removed `FailureHandler`, `DefaultFailureHandler`,
+  `configureExpectFailureHandler`, and `getOrCreateExpectFailureHandler`.
+  Now that `expect` is in the `unittest` package, these are no longer needed.
+
 ## 0.11.4+4
 
 * Deprecate the name parameter to `isInstanceOf`. All language implementations
diff --git a/lib/matcher.dart b/lib/matcher.dart
index c7790c9..c719fb1 100644
--- a/lib/matcher.dart
+++ b/lib/matcher.dart
@@ -8,15 +8,10 @@
 export 'src/core_matchers.dart';
 export 'src/description.dart';
 export 'src/error_matchers.dart';
-export 'src/expect.dart';
-export 'src/future_matchers.dart';
 export 'src/interfaces.dart';
 export 'src/iterable_matchers.dart';
 export 'src/map_matchers.dart';
 export 'src/numeric_matchers.dart';
 export 'src/operator_matchers.dart';
-export 'src/prints_matcher.dart';
 export 'src/string_matchers.dart';
-export 'src/throws_matcher.dart';
-export 'src/throws_matchers.dart';
 export 'src/util.dart';
diff --git a/lib/src/core_matchers.dart b/lib/src/core_matchers.dart
index ba0ac2e..a2e9718 100644
--- a/lib/src/core_matchers.dart
+++ b/lib/src/core_matchers.dart
@@ -302,8 +302,8 @@
       int minLength = escapedItem.length < escapedValue.length
           ? escapedItem.length
           : escapedValue.length;
-      int start;
-      for (start = 0; start < minLength; start++) {
+      var start = 0;
+      for (; start < minLength; start++) {
         if (escapedValue.codeUnitAt(start) != escapedItem.codeUnitAt(start)) {
           break;
         }
diff --git a/lib/src/expect.dart b/lib/src/expect.dart
deleted file mode 100644
index 08eb68e..0000000
--- a/lib/src/expect.dart
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.expect;
-
-import 'core_matchers.dart';
-import 'description.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// The objects thrown by the default failure handler.
-class TestFailure extends Error {
-  final String message;
-
-  TestFailure(this.message);
-
-  String toString() => message;
-}
-
-/// Failed matches are reported using a default IFailureHandler.
-/// The default implementation simply throws [TestFailure]s;
-/// this can be replaced by some other implementation of
-/// IFailureHandler by calling configureExpectHandler.
-abstract class FailureHandler {
-  /// This handles failures given a textual decription
-  void fail(String reason);
-
-  /// This handles failures given the actual [value], the [matcher]
-  /// the [reason] (argument from [expect]), some additonal [matchState]
-  /// generated by the [matcher], and a verbose flag which controls in
-  /// some cases how much [matchState] information is used. It will use
-  /// these to create a detailed error message (typically by calling
-  /// an [ErrorFormatter]) and then call [fail] with this message.
-  void failMatch(
-      actual, Matcher matcher, String reason, Map matchState, bool verbose);
-}
-
-/// The ErrorFormatter type is used for functions that
-/// can be used to build up error reports upon [expect] failures.
-/// There is one built-in implementation ([defaultErrorFormatter])
-/// which is used by the default failure handler. If the failure handler
-/// is replaced it may be desirable to replace the [stringDescription]
-/// error formatter with another.
-typedef String ErrorFormatter(
-    actual, Matcher matcher, String reason, Map matchState, bool verbose);
-
-/// This Function is used by certain Matchers to catch certain exceptions.
-///
-/// Some matchers, like those for Futures and exception testing,
-/// can fail in asynchronous sections, and throw exceptions.
-/// A user of this library will typically want to catch and handle
-/// such exceptions. The [wrapAsync] property is a function that
-/// can wrap callbacks used by these Matchers so that they can be
-/// used safely. For example, the unittest library will set this
-/// to be `expectAsync`. By default this is an identity function.
-Function wrapAsync = (Function f, [id]) => f;
-
-/// Assert that [actual] matches [matcher].
-///
-/// This is the main assertion function. [reason] is optional and is typically
-/// not supplied, as a reason is generated from the matcher; if [reason]
-/// is included it is appended to the reason generated by the matcher.
-///
-/// [matcher] can be a value in which case it will be wrapped in an
-/// [equals] matcher.
-///
-/// If the assertion fails, then the default behavior is to throw a
-/// [TestFailure], but this behavior can be changed by calling
-/// [configureExpectFailureHandler] and providing an alternative handler that
-/// implements the [IFailureHandler] interface. It is also possible to
-/// pass a [failureHandler] to [expect] as a final parameter for fine-
-/// grained control.
-///
-/// In some cases extra diagnostic info can be produced on failure (for
-/// example, stack traces on mismatched exceptions). To enable these,
-/// [verbose] should be specified as true;
-void expect(actual, matcher,
-    {String reason, FailureHandler failureHandler, bool verbose: false}) {
-  matcher = wrapMatcher(matcher);
-  bool doesMatch;
-  var matchState = {};
-  try {
-    doesMatch = matcher.matches(actual, matchState);
-  } catch (e, trace) {
-    doesMatch = false;
-    if (reason == null) {
-      reason = '${(e is String) ? e : e.toString()} at $trace';
-    }
-  }
-  if (!doesMatch) {
-    if (failureHandler == null) {
-      failureHandler = getOrCreateExpectFailureHandler();
-    }
-    failureHandler.failMatch(actual, matcher, reason, matchState, verbose);
-  }
-}
-
-void fail(String message, {FailureHandler failureHandler}) {
-  if (failureHandler == null) {
-    failureHandler = getOrCreateExpectFailureHandler();
-  }
-  failureHandler.fail(message);
-}
-
-// The handler for failed asserts.
-FailureHandler _assertFailureHandler = null;
-
-// The default failure handler that throws [TestFailure]s.
-class DefaultFailureHandler implements FailureHandler {
-  DefaultFailureHandler() {
-    if (_assertErrorFormatter == null) {
-      _assertErrorFormatter = _defaultErrorFormatter;
-    }
-  }
-  void fail(String reason) {
-    throw new TestFailure(reason);
-  }
-  void failMatch(
-      actual, Matcher matcher, String reason, Map matchState, bool verbose) {
-    fail(_assertErrorFormatter(actual, matcher, reason, matchState, verbose));
-  }
-}
-
-/// Changes the default failure handler for [expect].
-///
-/// [handler] is a reference to the new handler; if this is omitted
-/// or null then the failure handler is reset to the default, which
-/// throws [TestFailure]s on [expect] assertion failures.
-void configureExpectFailureHandler([FailureHandler handler = null]) {
-  if (handler == null) {
-    handler = new DefaultFailureHandler();
-  }
-  _assertFailureHandler = handler;
-}
-
-FailureHandler getOrCreateExpectFailureHandler() {
-  if (_assertFailureHandler == null) {
-    configureExpectFailureHandler();
-  }
-  return _assertFailureHandler;
-}
-
-// The error message formatter for failed asserts.
-ErrorFormatter _assertErrorFormatter = null;
-
-// The default error formatter implementation.
-String _defaultErrorFormatter(
-    actual, Matcher matcher, String reason, Map matchState, bool verbose) {
-  var description = new StringDescription();
-  description.add('Expected: ').addDescriptionOf(matcher).add('\n');
-  description.add('  Actual: ').addDescriptionOf(actual).add('\n');
-
-  var mismatchDescription = new StringDescription();
-  matcher.describeMismatch(actual, mismatchDescription, matchState, verbose);
-
-  if (mismatchDescription.length > 0) {
-    description.add('   Which: ${mismatchDescription}\n');
-  }
-  if (reason != null) {
-    description.add(reason).add('\n');
-  }
-  return description.toString();
-}
-
-/// Changes the failure message formatter for expect().
-///
-/// [formatter] is a reference to the new formatter; if this is omitted or
-/// null then the failure formatter is reset to the default. The new
-/// formatter is returned; this allows custom expect handlers to easily
-/// get a reference to the default formatter.
-ErrorFormatter configureExpectFormatter([ErrorFormatter formatter = null]) {
-  if (formatter == null) {
-    formatter = _defaultErrorFormatter;
-  }
-  return _assertErrorFormatter = formatter;
-}
diff --git a/lib/src/future_matchers.dart b/lib/src/future_matchers.dart
deleted file mode 100644
index bdbd62f..0000000
--- a/lib/src/future_matchers.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.future_matchers;
-
-import 'dart:async';
-
-import 'expect.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// Matches a [Future] that completes successfully with a value.
-///
-/// Note that this creates an asynchronous expectation. The call to `expect()`
-/// that includes this will return immediately and execution will continue.
-/// Later, when the future completes, the actual expectation will run.
-///
-/// To test that a Future completes with an exception, you can use [throws] and
-/// [throwsA].
-final Matcher completes = const _Completes(null, '');
-
-/// Matches a [Future] that completes succesfully with a value that matches
-/// [matcher].
-///
-/// Note that this creates an asynchronous expectation. The call to
-/// `expect()` that includes this will return immediately and execution will
-/// continue. Later, when the future completes, the actual expectation will run.
-///
-/// To test that a Future completes with an exception, you can use [throws] and
-/// [throwsA].
-///
-/// [id] is an optional tag that can be used to identify the completion matcher
-/// in error messages.
-Matcher completion(matcher, [String id = '']) =>
-    new _Completes(wrapMatcher(matcher), id);
-
-class _Completes extends Matcher {
-  final Matcher _matcher;
-  final String _id;
-
-  const _Completes(this._matcher, this._id);
-
-  bool matches(item, Map matchState) {
-    if (item is! Future) return false;
-    var done = wrapAsync((fn) => fn(), _id);
-
-    item.then((value) {
-      done(() {
-        if (_matcher != null) expect(value, _matcher);
-      });
-    }, onError: (error, trace) {
-      var id = _id == '' ? '' : '${_id} ';
-      var reason = 'Expected future ${id}to complete successfully, '
-          'but it failed with ${error}';
-      if (trace != null) {
-        var stackTrace = trace.toString();
-        stackTrace = '  ${stackTrace.replaceAll('\n', '\n  ')}';
-        reason = '$reason\nStack trace:\n$stackTrace';
-      }
-      done(() => fail(reason));
-    });
-
-    return true;
-  }
-
-  Description describe(Description description) {
-    if (_matcher == null) {
-      description.add('completes successfully');
-    } else {
-      description.add('completes to a value that ').addDescriptionOf(_matcher);
-    }
-    return description;
-  }
-}
diff --git a/lib/src/iterable_matchers.dart b/lib/src/iterable_matchers.dart
index 118575a..7185e92 100644
--- a/lib/src/iterable_matchers.dart
+++ b/lib/src/iterable_matchers.dart
@@ -120,8 +120,8 @@
   final List _expectedValues;
 
   _UnorderedEquals(Iterable expected)
-      : super(expected.map(equals)),
-        _expectedValues = expected.toList();
+      : _expectedValues = expected.toList(),
+        super(expected.map(equals));
 
   Description describe(Description description) => description
       .add('equals ')
diff --git a/lib/src/prints_matcher.dart b/lib/src/prints_matcher.dart
deleted file mode 100644
index be6abe3..0000000
--- a/lib/src/prints_matcher.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.prints_matcher;
-
-import 'dart:async';
-
-import 'description.dart';
-import 'expect.dart';
-import 'interfaces.dart';
-import 'future_matchers.dart';
-import 'util.dart';
-
-/// Matches a [Function] that prints text that matches [matcher].
-///
-/// [matcher] may be a String or a [Matcher].
-///
-/// If the function this runs against returns a [Future], all text printed by
-/// the function (using [Zone] scoping) until that Future completes is matched.
-///
-/// This only tracks text printed using the [print] function.
-Matcher prints(matcher) => new _Prints(wrapMatcher(matcher));
-
-class _Prints extends Matcher {
-  final Matcher _matcher;
-
-  _Prints(this._matcher);
-
-  bool matches(item, Map matchState) {
-    if (item is! Function) return false;
-
-    var buffer = new StringBuffer();
-    var result = runZoned(item,
-        zoneSpecification: new ZoneSpecification(print: (_, __, ____, line) {
-      buffer.writeln(line);
-    }));
-
-    if (result is! Future) {
-      var actual = buffer.toString();
-      matchState['prints.actual'] = actual;
-      return _matcher.matches(actual, matchState);
-    }
-
-    return completes.matches(result.then(wrapAsync((_) {
-      expect(buffer.toString(), _matcher);
-    }, 'prints')), matchState);
-  }
-
-  Description describe(Description description) =>
-      description.add('prints ').addDescriptionOf(_matcher);
-
-  Description describeMismatch(
-      item, Description description, Map matchState, bool verbose) {
-    var actual = matchState.remove('prints.actual');
-    if (actual == null) return description;
-    if (actual.isEmpty) return description.add("printed nothing.");
-
-    description.add('printed ').addDescriptionOf(actual);
-
-    // Create a new description for the matcher because at least
-    // [_StringEqualsMatcher] replaces the previous contents of the description.
-    var innerMismatch = _matcher
-        .describeMismatch(actual, new StringDescription(), matchState, verbose)
-        .toString();
-
-    if (innerMismatch.isNotEmpty) {
-      description.add('\n   Which: ').add(innerMismatch.toString());
-    }
-
-    return description;
-  }
-}
diff --git a/lib/src/throws_matcher.dart b/lib/src/throws_matcher.dart
deleted file mode 100644
index 461c585..0000000
--- a/lib/src/throws_matcher.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.throws_matcher;
-
-import 'dart:async';
-
-import 'expect.dart';
-import 'interfaces.dart';
-import 'util.dart';
-
-/// This can be used to match two kinds of objects:
-///
-///   * A [Function] that throws an exception when called. The function cannot
-///     take any arguments. If you want to test that a function expecting
-///     arguments throws, wrap it in another zero-argument function that calls
-///     the one you want to test.
-///
-///   * A [Future] that completes with an exception. Note that this creates an
-///     asynchronous expectation. The call to `expect()` that includes this will
-///     return immediately and execution will continue. Later, when the future
-///     completes, the actual expectation will run.
-const Matcher throws = const Throws();
-
-/// This can be used to match two kinds of objects:
-///
-///   * A [Function] that throws an exception when called. The function cannot
-///     take any arguments. If you want to test that a function expecting
-///     arguments throws, wrap it in another zero-argument function that calls
-///     the one you want to test.
-///
-///   * A [Future] that completes with an exception. Note that this creates an
-///     asynchronous expectation. The call to `expect()` that includes this will
-///     return immediately and execution will continue. Later, when the future
-///     completes, the actual expectation will run.
-///
-/// In both cases, when an exception is thrown, this will test that the exception
-/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
-/// will implicitly be treated as `equals(matcher)`.
-Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
-
-class Throws extends Matcher {
-  final Matcher _matcher;
-
-  const Throws([Matcher matcher]) : this._matcher = matcher;
-
-  bool matches(item, Map matchState) {
-    if (item is! Function && item is! Future) return false;
-    if (item is Future) {
-      var done = wrapAsync((fn) => fn());
-
-      // Queue up an asynchronous expectation that validates when the future
-      // completes.
-      item.then((value) {
-        done(() {
-          fail("Expected future to fail, but succeeded with '$value'.");
-        });
-      }, onError: (error, trace) {
-        done(() {
-          if (_matcher == null) return;
-          var reason;
-          if (trace != null) {
-            var stackTrace = trace.toString();
-            stackTrace = "  ${stackTrace.replaceAll("\n", "\n  ")}";
-            reason = "Actual exception trace:\n$stackTrace";
-          }
-          expect(error, _matcher, reason: reason);
-        });
-      });
-      // It hasn't failed yet.
-      return true;
-    }
-
-    try {
-      item();
-      return false;
-    } catch (e, s) {
-      if (_matcher == null || _matcher.matches(e, matchState)) {
-        return true;
-      } else {
-        addStateInfo(matchState, {'exception': e, 'stack': s});
-        return false;
-      }
-    }
-  }
-
-  Description describe(Description description) {
-    if (_matcher == null) {
-      return description.add("throws");
-    } else {
-      return description.add('throws ').addDescriptionOf(_matcher);
-    }
-  }
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (item is! Function && item is! Future) {
-      return mismatchDescription.add('is not a Function or Future');
-    } else if (_matcher == null || matchState['exception'] == null) {
-      return mismatchDescription.add('did not throw');
-    } else {
-      mismatchDescription
-          .add('threw ')
-          .addDescriptionOf(matchState['exception']);
-      if (verbose) {
-        mismatchDescription.add(' at ').add(matchState['stack'].toString());
-      }
-      return mismatchDescription;
-    }
-  }
-}
diff --git a/lib/src/throws_matchers.dart b/lib/src/throws_matchers.dart
deleted file mode 100644
index 35dfb39..0000000
--- a/lib/src/throws_matchers.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.throws_matchers;
-
-import 'error_matchers.dart';
-import 'interfaces.dart';
-import 'throws_matcher.dart';
-
-/// A matcher for functions that throw ArgumentError.
-const Matcher throwsArgumentError = const Throws(isArgumentError);
-
-/// A matcher for functions that throw ConcurrentModificationError.
-const Matcher throwsConcurrentModificationError =
-    const Throws(isConcurrentModificationError);
-
-/// A matcher for functions that throw CyclicInitializationError.
-const Matcher throwsCyclicInitializationError =
-    const Throws(isCyclicInitializationError);
-
-/// A matcher for functions that throw Exception.
-const Matcher throwsException = const Throws(isException);
-
-/// A matcher for functions that throw FormatException.
-const Matcher throwsFormatException = const Throws(isFormatException);
-
-/// A matcher for functions that throw NoSuchMethodError.
-const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
-
-/// A matcher for functions that throw NullThrownError.
-const Matcher throwsNullThrownError = const Throws(isNullThrownError);
-
-/// A matcher for functions that throw RangeError.
-const Matcher throwsRangeError = const Throws(isRangeError);
-
-/// A matcher for functions that throw StateError.
-const Matcher throwsStateError = const Throws(isStateError);
-
-/// A matcher for functions that throw Exception.
-const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
-
-/// A matcher for functions that throw UnsupportedError.
-const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
diff --git a/pubspec.yaml b/pubspec.yaml
index 47e8e84..09373d5 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,9 +1,9 @@
 name: matcher
-version: 0.11.4+4
+version: 0.12.0-dev
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: https://github.com/dart-lang/matcher
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dev_dependencies:
-  unittest: '>=0.10.0 <0.12.0'
+  unittest: '>=0.12.0-alpha.0 <0.13.0'
diff --git a/test/core_matchers_test.dart b/test/core_matchers_test.dart
index 5cd17da..1769ba4 100644
--- a/test/core_matchers_test.dart
+++ b/test/core_matchers_test.dart
@@ -10,8 +10,6 @@
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('isTrue', () {
     shouldPass(true, isTrue);
     shouldFail(false, isTrue, "Expected: true Actual: <false>");
@@ -117,10 +115,10 @@
     shouldPass(a, hasLength(0));
     shouldPass(b, hasLength(0));
     shouldPass('a', hasLength(1));
-    shouldFail(0, hasLength(0), new PrefixMatcher(
+    shouldFail(0, hasLength(0),
         "Expected: an object with length of <0> "
         "Actual: <0> "
-        "Which: has no length property"));
+        "Which: has no length property");
 
     b.add(0);
     shouldPass(b, hasLength(1));
@@ -189,4 +187,16 @@
       shouldPass('cow', predicate((x) => x is String, "an instance of String"));
     });
   });
+
+  test("Feature Matcher", () {
+    var w = new Widget();
+    w.price = 10;
+    shouldPass(w, new HasPrice(10));
+    shouldPass(w, new HasPrice(greaterThan(0)));
+    shouldFail(w, new HasPrice(greaterThan(10)),
+        "Expected: Widget with a price that is a value greater than <10> "
+        "Actual: <Instance of 'Widget'> "
+        "Which: has price with value <10> which is not "
+        "a value greater than <10>");
+  });
 }
diff --git a/test/future_matchers_test.dart b/test/future_matchers_test.dart
deleted file mode 100644
index 4e21ea2..0000000
--- a/test/future_matchers_test.dart
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.future_matchers_test;
-
-import 'dart:async';
-
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
-
-import 'test_utils.dart';
-
-void main() {
-  initUtils();
-
-  test('completes - unexpected error', () {
-    var completer = new Completer();
-    completer.completeError('X');
-    shouldFail(completer.future, completes, contains(
-        'Expected future to complete successfully, '
-        'but it failed with X'), isAsync: true);
-  });
-
-  test('completes - successfully', () {
-    var completer = new Completer();
-    completer.complete('1');
-    shouldPass(completer.future, completes, isAsync: true);
-  });
-
-  test('throws - unexpected to see normal completion', () {
-    var completer = new Completer();
-    completer.complete('1');
-    shouldFail(completer.future, throws,
-        contains("Expected future to fail, but succeeded with '1'"),
-        isAsync: true);
-  });
-
-  test('throws - expected to see exception', () {
-    var completer = new Completer();
-    completer.completeError('X');
-    shouldPass(completer.future, throws, isAsync: true);
-  });
-
-  test('throws - expected to see exception thrown later on', () {
-    var completer = new Completer();
-    var chained = completer.future.then((_) {
-      throw 'X';
-    });
-    shouldPass(chained, throws, isAsync: true);
-    completer.complete('1');
-  });
-
-  test('throwsA - unexpected normal completion', () {
-    var completer = new Completer();
-    completer.complete('1');
-    shouldFail(completer.future, throwsA(equals('X')),
-        contains("Expected future to fail, but succeeded with '1'"),
-        isAsync: true);
-  });
-
-  test('throwsA - correct error', () {
-    var completer = new Completer();
-    completer.completeError('X');
-    shouldPass(completer.future, throwsA(equals('X')), isAsync: true);
-  });
-
-  test('throwsA - wrong error', () {
-    var completer = new Completer();
-    completer.completeError('X');
-    shouldFail(completer.future, throwsA(equals('Y')),
-        "Expected: 'Y' Actual: 'X' "
-        "Which: is different. "
-        "Expected: Y Actual: X ^ Differ at offset 0", isAsync: true);
-  });
-}
diff --git a/test/iterable_matchers_test.dart b/test/iterable_matchers_test.dart
index da454fb..e92fff0 100644
--- a/test/iterable_matchers_test.dart
+++ b/test/iterable_matchers_test.dart
@@ -10,8 +10,6 @@
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('isEmpty', () {
     shouldPass([], isEmpty);
     shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
@@ -163,4 +161,27 @@
         "Actual: [1, 2, 3] "
         "Which: has <1> which is not double <1> at index 0");
   });
+
+  test('isEmpty', () {
+    var d = new SimpleIterable(0);
+    var e = new SimpleIterable(1);
+    shouldPass(d, isEmpty);
+    shouldFail(e, isEmpty, "Expected: empty "
+        "Actual: SimpleIterable:[1]");
+  });
+
+  test('isNotEmpty', () {
+    var d = new SimpleIterable(0);
+    var e = new SimpleIterable(1);
+    shouldPass(e, isNotEmpty);
+    shouldFail(d, isNotEmpty, "Expected: non-empty "
+        "Actual: SimpleIterable:[]");
+  });
+
+  test('contains', () {
+    var d = new SimpleIterable(3);
+    shouldPass(d, contains(2));
+    shouldFail(d, contains(5), "Expected: contains <5> "
+        "Actual: SimpleIterable:[3, 2, 1]");
+  });
 }
diff --git a/test/matchers_minified_test.dart b/test/matchers_minified_test.dart
deleted file mode 100644
index d9ee582..0000000
--- a/test/matchers_minified_test.dart
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This file is for matcher tests that rely on the names of various Dart types.
-// These tests normally fail when run in minified dart2js, since the names will
-// be mangled. This version of the file is modified to expect minified names.
-
-library matcher.minified_test;
-
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
-
-import 'test_common.dart';
-import 'test_utils.dart';
-
-// A regexp fragment matching a minified name.
-const _MINIFIED_NAME = r"[A-Za-z0-9]{1,3}";
-
-void main() {
-  initUtils();
-
-  group('Core matchers', () {
-    test('throwsFormatException', () {
-      shouldPass(() {
-        throw new FormatException('');
-      }, throwsFormatException);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsFormatException, matches(r"Expected: throws FormatException +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-
-    test('throwsArgumentError', () {
-      shouldPass(() {
-        throw new ArgumentError('');
-      }, throwsArgumentError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsArgumentError, matches(r"Expected: throws ArgumentError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-
-    test('throwsRangeError', () {
-      shouldPass(() {
-        throw new RangeError(0);
-      }, throwsRangeError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsRangeError, matches(r"Expected: throws RangeError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-
-    test('throwsNoSuchMethodError', () {
-      shouldPass(() {
-        throw new NoSuchMethodError(null, const Symbol(''), null, null);
-      }, throwsNoSuchMethodError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsNoSuchMethodError, matches(
-          r"Expected: throws NoSuchMethodError +"
-              r"Actual: <Closure(: \(\) => dynamic)?> +"
-              r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-
-    test('throwsUnimplementedError', () {
-      shouldPass(() {
-        throw new UnimplementedError('');
-      }, throwsUnimplementedError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsUnimplementedError, matches(
-          r"Expected: throws UnimplementedError +"
-              r"Actual: <Closure(: \(\) => dynamic)?> +"
-              r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-
-    test('throwsUnsupportedError', () {
-      shouldPass(() {
-        throw new UnsupportedError('');
-      }, throwsUnsupportedError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsUnsupportedError, matches(r"Expected: throws UnsupportedError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-
-    test('throwsStateError', () {
-      shouldPass(() {
-        throw new StateError('');
-      }, throwsStateError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsStateError, matches(r"Expected: throws StateError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
-    });
-  });
-
-  group('Iterable Matchers', () {
-    test('isEmpty', () {
-      var d = new SimpleIterable(0);
-      var e = new SimpleIterable(1);
-      shouldPass(d, isEmpty);
-      shouldFail(e, isEmpty,
-          matches(r"Expected: empty +Actual: " + _MINIFIED_NAME + r":\[1\]"));
-    });
-
-    test('isNotEmpty', () {
-      var d = new SimpleIterable(0);
-      var e = new SimpleIterable(1);
-      shouldPass(e, isNotEmpty);
-      shouldFail(d, isNotEmpty, matches(
-          r"Expected: non-empty +Actual: " + _MINIFIED_NAME + r":\[\]"));
-    });
-
-    test('contains', () {
-      var d = new SimpleIterable(3);
-      shouldPass(d, contains(2));
-      shouldFail(d, contains(5), matches(r"Expected: contains <5> +"
-          r"Actual: " + _MINIFIED_NAME + r":\[3, 2, 1\]"));
-    });
-  });
-
-  group('Feature Matchers', () {
-    test("Feature Matcher", () {
-      var w = new Widget();
-      w.price = 10;
-      shouldPass(w, new HasPrice(10));
-      shouldPass(w, new HasPrice(greaterThan(0)));
-      shouldFail(w, new HasPrice(greaterThan(10)), matches(
-          r"Expected: Widget with a price that is a value greater than "
-              r"<10> +"
-              r"Actual: <Instance of '" + _MINIFIED_NAME + r"'> +"
-              r"Which: has price with value <10> which is not "
-              r"a value greater than <10>"));
-    });
-  });
-}
diff --git a/test/matchers_unminified_test.dart b/test/matchers_unminified_test.dart
deleted file mode 100644
index b9ea535..0000000
--- a/test/matchers_unminified_test.dart
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This file is for matcher tests that rely on the names of various Dart types.
-// These tests will fail when run in minified dart2js, since the names will be
-// mangled. A version of this file that works in minified dart2js is in
-// matchers_minified_test.dart.
-
-library matcher.unminified_test;
-
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show group, test;
-
-import 'test_common.dart';
-import 'test_utils.dart';
-
-void main() {
-  initUtils();
-
-  group('Core matchers', () {
-    test('throwsFormatException', () {
-      shouldPass(() {
-        throw new FormatException('');
-      }, throwsFormatException);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsFormatException, matches(r"Expected: throws FormatException +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-
-    test('throwsArgumentError', () {
-      shouldPass(() {
-        throw new ArgumentError('');
-      }, throwsArgumentError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsArgumentError, matches(r"Expected: throws ArgumentError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-
-    test('throwsRangeError', () {
-      shouldPass(() {
-        throw new RangeError(0);
-      }, throwsRangeError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsRangeError, matches(r"Expected: throws RangeError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-
-    test('throwsNoSuchMethodError', () {
-      shouldPass(() {
-        throw new NoSuchMethodError(null, const Symbol(''), null, null);
-      }, throwsNoSuchMethodError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsNoSuchMethodError, matches(
-          r"Expected: throws NoSuchMethodError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-
-    test('throwsUnimplementedError', () {
-      shouldPass(() {
-        throw new UnimplementedError('');
-      }, throwsUnimplementedError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsUnimplementedError, matches(
-          r"Expected: throws UnimplementedError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-
-    test('throwsUnsupportedError', () {
-      shouldPass(() {
-        throw new UnsupportedError('');
-      }, throwsUnsupportedError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsUnsupportedError, matches(r"Expected: throws UnsupportedError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-
-    test('throwsStateError', () {
-      shouldPass(() {
-        throw new StateError('');
-      }, throwsStateError);
-      shouldFail(() {
-        throw new Exception();
-      }, throwsStateError, matches(r"Expected: throws StateError +"
-          r"Actual: <Closure(: \(\) => dynamic)?> +"
-          r"Which: threw \?:<Exception>"));
-    });
-  });
-
-  group('Iterable Matchers', () {
-    test('isEmpty', () {
-      var d = new SimpleIterable(0);
-      var e = new SimpleIterable(1);
-      shouldPass(d, isEmpty);
-      shouldFail(e, isEmpty, "Expected: empty "
-          "Actual: SimpleIterable:[1]");
-    });
-
-    test('isNotEmpty', () {
-      var d = new SimpleIterable(0);
-      var e = new SimpleIterable(1);
-      shouldPass(e, isNotEmpty);
-      shouldFail(d, isNotEmpty, "Expected: non-empty "
-          "Actual: SimpleIterable:[]");
-    });
-
-    test('contains', () {
-      var d = new SimpleIterable(3);
-      shouldPass(d, contains(2));
-      shouldFail(d, contains(5), "Expected: contains <5> "
-          "Actual: SimpleIterable:[3, 2, 1]");
-    });
-  });
-
-  group('Feature Matchers', () {
-    test("Feature Matcher", () {
-      var w = new Widget();
-      w.price = 10;
-      shouldPass(w, new HasPrice(10));
-      shouldPass(w, new HasPrice(greaterThan(0)));
-      shouldFail(w, new HasPrice(greaterThan(10)),
-          "Expected: Widget with a price that is a value greater than <10> "
-          "Actual: <Instance of 'Widget'> "
-          "Which: has price with value <10> which is not "
-          "a value greater than <10>");
-    });
-  });
-}
diff --git a/test/mirror_matchers_test.dart b/test/mirror_matchers_test.dart
index 90d7c46..3e2a4ed 100644
--- a/test/mirror_matchers_test.dart
+++ b/test/mirror_matchers_test.dart
@@ -17,8 +17,6 @@
 }
 
 void main() {
-  initUtils();
-
   test('hasProperty', () {
     var foo = [3];
     shouldPass(foo, hasProperty('length', 1));
diff --git a/test/numeric_matchers_test.dart b/test/numeric_matchers_test.dart
index 7ced6b4..af0f634 100644
--- a/test/numeric_matchers_test.dart
+++ b/test/numeric_matchers_test.dart
@@ -10,8 +10,6 @@
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('greaterThan', () {
     shouldPass(10, greaterThan(9));
     shouldFail(9, greaterThan(10), "Expected: a value greater than <10> "
diff --git a/test/operator_matchers_test.dart b/test/operator_matchers_test.dart
index b92986c..7cf0d59 100644
--- a/test/operator_matchers_test.dart
+++ b/test/operator_matchers_test.dart
@@ -5,13 +5,12 @@
 library matcher.operator_matchers_test;
 
 import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
+import 'package:unittest/unittest.dart'
+    show test, group, expect, throwsArgumentError;
 
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('anyOf', () {
     // with a list
     shouldFail(
diff --git a/test/pretty_print_minified_test.dart b/test/pretty_print_minified_test.dart
deleted file mode 100644
index f1107f7..0000000
--- a/test/pretty_print_minified_test.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This file is for pretty-print tests that rely on the names of various Dart
-// types. These tests normally fail when run in minified dart2js, since the
-// names will be mangled. This version of the file is modified to expect
-// minified names.
-
-library matcher.print_minified_test;
-
-import 'dart:collection';
-
-import 'package:matcher/matcher.dart';
-import 'package:matcher/src/pretty_print.dart';
-import 'package:unittest/unittest.dart' show test, group;
-
-class DefaultToString {}
-
-class CustomToString {
-  String toString() => "string representation";
-}
-
-class _PrivateName {
-  String toString() => "string representation";
-}
-
-class _PrivateNameIterable extends IterableMixin {
-  Iterator get iterator => [1, 2, 3].iterator;
-}
-
-// A regexp fragment matching a minified name.
-final _minifiedName = r"[A-Za-z0-9]{1,3}";
-
-void main() {
-  group('with an object', () {
-    test('with a default [toString]', () {
-      expect(prettyPrint(new DefaultToString()),
-          matches(r"<Instance of '" + _minifiedName + r"'>"));
-    });
-
-    test('with a custom [toString]', () {
-      expect(prettyPrint(new CustomToString()),
-          matches(_minifiedName + r':<string representation>'));
-    });
-
-    test('with a custom [toString] and a private name', () {
-      expect(prettyPrint(new _PrivateName()),
-          matches(_minifiedName + r':<string representation>'));
-    });
-  });
-
-  group('with an iterable', () {
-    test("that's not a list", () {
-      expect(prettyPrint([1, 2, 3, 4].map((n) => n * 2)),
-          matches(_minifiedName + r":\[2, 4, 6, 8\]"));
-    });
-
-    test("that's not a list and has a private name", () {
-      expect(prettyPrint(new _PrivateNameIterable()),
-          matches(_minifiedName + r":\[1, 2, 3\]"));
-    });
-  });
-}
diff --git a/test/pretty_print_test.dart b/test/pretty_print_test.dart
index 6d443b5..c1e0a59 100644
--- a/test/pretty_print_test.dart
+++ b/test/pretty_print_test.dart
@@ -4,9 +4,25 @@
 
 library matcher.pretty_print_test;
 
+import 'dart:collection';
+
 import 'package:matcher/matcher.dart';
 import 'package:matcher/src/pretty_print.dart';
-import 'package:unittest/unittest.dart' show group, test;
+import 'package:unittest/unittest.dart' show group, test, expect;
+
+class DefaultToString {}
+
+class CustomToString {
+  String toString() => "string representation";
+}
+
+class _PrivateName {
+  String toString() => "string representation";
+}
+
+class _PrivateNameIterable extends IterableMixin {
+  Iterator get iterator => [1, 2, 3].iterator;
+}
 
 void main() {
   test('with primitive objects', () {
@@ -191,4 +207,31 @@
           equals("{'0': 1, '2': 3, ...}"));
     });
   });
+  group('with an object', () {
+    test('with a default [toString]', () {
+      expect(prettyPrint(new DefaultToString()),
+          equals("<Instance of 'DefaultToString'>"));
+    });
+
+    test('with a custom [toString]', () {
+      expect(prettyPrint(new CustomToString()),
+          equals('CustomToString:<string representation>'));
+    });
+
+    test('with a custom [toString] and a private name', () {
+      expect(
+          prettyPrint(new _PrivateName()), equals('?:<string representation>'));
+    });
+  });
+
+  group('with an iterable', () {
+    test("that's not a list", () {
+      expect(prettyPrint([1, 2, 3, 4].map((n) => n * 2)),
+          equals("MappedListIterable:[2, 4, 6, 8]"));
+    });
+
+    test("that's not a list and has a private name", () {
+      expect(prettyPrint(new _PrivateNameIterable()), equals("?:[1, 2, 3]"));
+    });
+  });
 }
diff --git a/test/pretty_print_unminified_test.dart b/test/pretty_print_unminified_test.dart
deleted file mode 100644
index c8b2035..0000000
--- a/test/pretty_print_unminified_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This file is for pretty-print tests that rely on the names of various Dart
-// types. These tests will fail when run in minified dart2js, since the names
-// will be mangled. A version of this file that works in minified dart2js is in
-// pretty_print_minified_test.dart.
-
-library matcher.print_unminified_test;
-
-import 'dart:collection';
-
-import 'package:matcher/matcher.dart';
-import 'package:matcher/src/pretty_print.dart';
-import 'package:unittest/unittest.dart' show test, group;
-
-class DefaultToString {}
-
-class CustomToString {
-  String toString() => "string representation";
-}
-
-class _PrivateName {
-  String toString() => "string representation";
-}
-
-class _PrivateNameIterable extends IterableMixin {
-  Iterator get iterator => [1, 2, 3].iterator;
-}
-
-void main() {
-  group('with an object', () {
-    test('with a default [toString]', () {
-      expect(prettyPrint(new DefaultToString()),
-          equals("<Instance of 'DefaultToString'>"));
-    });
-
-    test('with a custom [toString]', () {
-      expect(prettyPrint(new CustomToString()),
-          equals('CustomToString:<string representation>'));
-    });
-
-    test('with a custom [toString] and a private name', () {
-      expect(
-          prettyPrint(new _PrivateName()), equals('?:<string representation>'));
-    });
-  });
-
-  group('with an iterable', () {
-    test("that's not a list", () {
-      expect(prettyPrint([1, 2, 3, 4].map((n) => n * 2)),
-          equals("MappedListIterable:[2, 4, 6, 8]"));
-    });
-
-    test("that's not a list and has a private name", () {
-      expect(prettyPrint(new _PrivateNameIterable()), equals("?:[1, 2, 3]"));
-    });
-  });
-}
diff --git a/test/prints_matcher_test.dart b/test/prints_matcher_test.dart
deleted file mode 100644
index 7680953..0000000
--- a/test/prints_matcher_test.dart
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.prints_matchers_test;
-
-import 'dart:async';
-
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart';
-
-import 'test_utils.dart';
-
-/// The VM and dart2js have different toStrings for closures.
-final closureToString = (() {}).toString();
-
-void main() {
-  initUtils();
-
-  group('synchronous', () {
-    test("passes with an expected print", () {
-      shouldPass(() => print("Hello, world!"), prints("Hello, world!\n"));
-    });
-
-    test("combines multiple prints", () {
-      shouldPass(() {
-        print("Hello");
-        print("World!");
-      }, prints("Hello\nWorld!\n"));
-    });
-
-    test("works with a Matcher", () {
-      shouldPass(() => print("Hello, world!"), prints(contains("Hello")));
-    });
-
-    test("describes a failure nicely", () {
-      shouldFail(() => print("Hello, world!"), prints("Goodbye, world!\n"),
-          "Expected: prints 'Goodbye, world!\\n' ''"
-          "  Actual: <$closureToString> "
-          "   Which: printed 'Hello, world!\\n' ''"
-          "   Which: is different. "
-          "Expected: Goodbye, w ... "
-          "  Actual: Hello, wor ... "
-          "          ^ Differ at offset 0");
-    });
-
-    test("describes a failure with a non-descriptive Matcher nicely", () {
-      shouldFail(() => print("Hello, world!"), prints(contains("Goodbye")),
-          "Expected: prints contains 'Goodbye'"
-          "  Actual: <$closureToString> "
-          "   Which: printed 'Hello, world!\\n' ''");
-    });
-
-    test("describes a failure with no text nicely", () {
-      shouldFail(() {}, prints(contains("Goodbye")),
-          "Expected: prints contains 'Goodbye'"
-          "  Actual: <$closureToString> "
-          "   Which: printed nothing.");
-    });
-  });
-
-  group('asynchronous', () {
-    test("passes with an expected print", () {
-      shouldPass(() => new Future(() => print("Hello, world!")),
-          prints("Hello, world!\n"));
-    });
-
-    test("combines multiple prints", () {
-      shouldPass(() => new Future(() {
-        print("Hello");
-        print("World!");
-      }), prints("Hello\nWorld!\n"));
-    });
-
-    test("works with a Matcher", () {
-      shouldPass(() => new Future(() => print("Hello, world!")),
-          prints(contains("Hello")));
-    });
-
-    test("describes a failure nicely", () {
-      shouldFail(() => new Future(() => print("Hello, world!")),
-          prints("Goodbye, world!\n"), "Expected: 'Goodbye, world!\\n' ''"
-          "  Actual: 'Hello, world!\\n' ''"
-          "   Which: is different. "
-          "Expected: Goodbye, w ... "
-          "  Actual: Hello, wor ... "
-          "          ^ Differ at offset 0", isAsync: true);
-    });
-
-    test("describes a failure with a non-descriptive Matcher nicely", () {
-      shouldFail(() => new Future(() => print("Hello, world!")),
-          prints(contains("Goodbye")), "Expected: contains 'Goodbye'"
-          "  Actual: 'Hello, world!\\n' ''", isAsync: true);
-    });
-
-    test("describes a failure with no text nicely", () {
-      shouldFail(() => new Future.value(), prints(contains("Goodbye")),
-          "Expected: contains 'Goodbye'"
-          "  Actual: ''", isAsync: true);
-    });
-  });
-}
diff --git a/test/string_matchers_test.dart b/test/string_matchers_test.dart
index 4cebd58..cb34a70 100644
--- a/test/string_matchers_test.dart
+++ b/test/string_matchers_test.dart
@@ -5,13 +5,11 @@
 library matcher.string_matchers_test;
 
 import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
+import 'package:unittest/unittest.dart' show test, group, expect;
 
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('Reports mismatches in whitespace and escape sequences', () {
     shouldFail('before\nafter', equals('before\\nafter'),
         contains('Differ at offset 7'));
diff --git a/test/test_common.dart b/test/test_common.dart
deleted file mode 100644
index c360fe7..0000000
--- a/test/test_common.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.test_common;
-
-import 'dart:collection';
-
-import 'package:matcher/matcher.dart';
-
-class Widget {
-  int price;
-}
-
-class HasPrice extends CustomMatcher {
-  HasPrice(matcher) : super("Widget with a price that is", "price", matcher);
-  featureValueOf(actual) => actual.price;
-}
-
-class SimpleIterable extends IterableBase<int> {
-  final int count;
-
-  SimpleIterable(this.count);
-
-  bool contains(int val) => count < val ? false : true;
-
-  bool any(bool f(element)) {
-    for (var i = 0; i <= count; i++) {
-      if (f(i)) return true;
-    }
-    return false;
-  }
-
-  String toString() => "<[$count]>";
-
-  Iterator get iterator {
-    return new _SimpleIterator(count);
-  }
-}
-
-class _SimpleIterator implements Iterator<int> {
-  int _count;
-  int _current;
-
-  _SimpleIterator(this._count);
-
-  bool moveNext() {
-    if (_count > 0) {
-      _current = _count;
-      _count--;
-      return true;
-    }
-    _current = null;
-    return false;
-  }
-
-  int get current => _current;
-}
diff --git a/test/test_utils.dart b/test/test_utils.dart
index 4df8e2e..b1a9756 100644
--- a/test/test_utils.dart
+++ b/test/test_utils.dart
@@ -4,36 +4,19 @@
 
 library matcher.test_utils;
 
-import 'dart:async';
+import 'dart:collection';
 
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, expectAsync;
+import 'package:unittest/unittest.dart';
 
-int _errorCount;
-String _errorString;
-FailureHandler _testHandler = null;
+void shouldFail(value, Matcher matcher, expected) {
+  var failed = false;
+  try {
+    expect(value, matcher);
+  } on TestFailure catch (err) {
+    failed = true;
 
-class MyFailureHandler extends DefaultFailureHandler {
-  void fail(String reason) {
-    ++_errorCount;
-    _errorString = reason;
-  }
-}
+    var _errorString = err.message;
 
-void initUtils() {
-  if (_testHandler == null) {
-    _testHandler = new MyFailureHandler();
-  }
-}
-
-void shouldFail(value, Matcher matcher, expected, {bool isAsync: false}) {
-  configureExpectFailureHandler(_testHandler);
-  _errorCount = 0;
-  _errorString = '';
-  expect(value, matcher);
-  afterTest() {
-    configureExpectFailureHandler(null);
-    expect(_errorCount, equals(1));
     if (expected is String) {
       expect(_errorString, equalsIgnoringWhitespace(expected));
     } else {
@@ -41,27 +24,11 @@
     }
   }
 
-  if (isAsync) {
-    Timer.run(expectAsync(afterTest));
-  } else {
-    afterTest();
-  }
+  expect(failed, isTrue, reason: 'Expected to fail.');
 }
 
-void shouldPass(value, Matcher matcher, {bool isAsync: false}) {
-  configureExpectFailureHandler(_testHandler);
-  _errorCount = 0;
-  _errorString = '';
+void shouldPass(value, Matcher matcher) {
   expect(value, matcher);
-  afterTest() {
-    configureExpectFailureHandler(null);
-    expect(_errorCount, equals(0));
-  }
-  if (isAsync) {
-    Timer.run(expectAsync(afterTest));
-  } else {
-    afterTest();
-  }
 }
 
 doesNotThrow() {}
@@ -69,16 +36,51 @@
   throw 'X';
 }
 
-class PrefixMatcher extends Matcher {
-  final String _prefix;
-  const PrefixMatcher(this._prefix);
-  bool matches(item, Map matchState) {
-    return item is String &&
-        (collapseWhitespace(item)).startsWith(collapseWhitespace(_prefix));
+class Widget {
+  int price;
+}
+
+class HasPrice extends CustomMatcher {
+  HasPrice(matcher) : super("Widget with a price that is", "price", matcher);
+  featureValueOf(actual) => actual.price;
+}
+
+class SimpleIterable extends IterableBase<int> {
+  final int count;
+
+  SimpleIterable(this.count);
+
+  bool contains(int val) => count < val ? false : true;
+
+  bool any(bool f(element)) {
+    for (var i = 0; i <= count; i++) {
+      if (f(i)) return true;
+    }
+    return false;
   }
 
-  Description describe(Description description) => description
-      .add('a string starting with ')
-      .addDescriptionOf(collapseWhitespace(_prefix))
-      .add(' ignoring whitespace');
+  String toString() => "<[$count]>";
+
+  Iterator get iterator {
+    return new _SimpleIterator(count);
+  }
+}
+
+class _SimpleIterator implements Iterator<int> {
+  int _count;
+  int _current;
+
+  _SimpleIterator(this._count);
+
+  bool moveNext() {
+    if (_count > 0) {
+      _current = _count;
+      _count--;
+      return true;
+    }
+    _current = null;
+    return false;
+  }
+
+  int get current => _current;
 }
diff --git a/test/throws_matchers_test.dart b/test/throws_matchers_test.dart
deleted file mode 100644
index f766002..0000000
--- a/test/throws_matchers_test.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library matcher.core_matchers_test;
-
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
-
-import 'test_utils.dart';
-
-void main() {
-  initUtils();
-
-  test('throws', () {
-    shouldFail(doesNotThrow, throws, matches(r"Expected: throws"
-        r"  Actual: <Closure(: \(\) => dynamic "
-        r"from Function 'doesNotThrow': static\.)?>"
-        r"   Which: did not throw"));
-    shouldPass(doesThrow, throws);
-    shouldFail(true, throws, "Expected: throws"
-        "  Actual: <true>"
-        "   Which: is not a Function or Future");
-  });
-
-  test('throwsA', () {
-    shouldPass(doesThrow, throwsA(equals('X')));
-    shouldFail(doesThrow, throwsA(equals('Y')), matches(r"Expected: throws 'Y'"
-        r"  Actual: <Closure(: \(\) => dynamic "
-        r"from Function 'doesThrow': static\.)?>"
-        r"   Which: threw 'X'"));
-  });
-
-  test('throwsA', () {
-    shouldPass(doesThrow, throwsA(equals('X')));
-    shouldFail(doesThrow, throwsA(equals('Y')), matches("Expected: throws 'Y'.*"
-        "Actual: <Closure.*"
-        "Which: threw 'X'"));
-  });
-
-  group('exception/error matchers', () {
-    test('throwsCyclicInitializationError', () {
-      expect(() => _Bicycle.foo, throwsCyclicInitializationError);
-    });
-
-    test('throwsConcurrentModificationError', () {
-      expect(() {
-        var a = {'foo': 'bar'};
-        for (var k in a.keys) {
-          a.remove(k);
-        }
-      }, throwsConcurrentModificationError);
-    });
-
-    test('throwsNullThrownError', () {
-      expect(() => throw null, throwsNullThrownError);
-    });
-  });
-}
-
-class _Bicycle {
-  static final foo = bar();
-
-  static bar() {
-    return foo + 1;
-  }
-}