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;
-  }
-}
