diff --git a/.gitignore b/.gitignore
index 388eff0..7dbf035 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 .pub/
 build/
 packages
+.packages
 
 # Or the files created by dart2js.
 *.dart.js
diff --git a/.status b/.status
deleted file mode 100644
index e659275..0000000
--- a/.status
+++ /dev/null
@@ -1,27 +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.
-
-# Skip non-test files ending with "_test".
-packages/*: Skip
-*/packages/*: Skip
-*/*/packages/*: Skip
-*/*/*/packages/*: Skip
-*/*/*/*packages/*: Skip
-*/*/*/*/*packages/*: Skip
-
-# Only run tests from the build directory, since we don't care about the
-# 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
diff --git a/.test_config b/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3c2a25e..ed15206 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,28 @@
+## 0.12.0+2
+
+* Fix all strong-mode warnings.
+
+## 0.12.0+1
+
+* Fix test files to use `test` instead of `unittest` pkg.
+
+## 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.
+
+* Removed the `name` parameter for `isInstanceOf`. This was previously
+  deprecated, and is no longer necessary since all language implementations now
+  support converting the type parameter to a string directly.
+
 ## 0.11.4+6
 
 * Fix a bug introduced in 0.11.4+5 in which operator matchers broke when taking
diff --git a/lib/matcher.dart b/lib/matcher.dart
index c7790c9..f4ebf08 100644
--- a/lib/matcher.dart
+++ b/lib/matcher.dart
@@ -3,20 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Support for specifying test expectations, such as for unit tests.
-library matcher;
-
 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/mirror_matchers.dart b/lib/mirror_matchers.dart
index d244831..0ce90da 100644
--- a/lib/mirror_matchers.dart
+++ b/lib/mirror_matchers.dart
@@ -4,8 +4,6 @@
 
 /// The mirror matchers library provides some additional matchers that
 /// make use of `dart:mirrors`.
-library matcher.mirror_matchers;
-
 import 'dart:mirrors';
 
 import 'matcher.dart';
diff --git a/lib/src/core_matchers.dart b/lib/src/core_matchers.dart
index ba0ac2e..a313d31 100644
--- a/lib/src/core_matchers.dart
+++ b/lib/src/core_matchers.dart
@@ -2,8 +2,6 @@
 // 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;
-
 import 'description.dart';
 import 'interfaces.dart';
 import 'util.dart';
@@ -302,8 +300,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;
         }
@@ -373,9 +371,7 @@
 ///
 ///     expect(bar, new isInstanceOf<Foo>());
 class isInstanceOf<T> extends Matcher {
-  /// The [name] parameter does nothing; it's deprecated and will be removed in
-  /// future version of [matcher].
-  const isInstanceOf([@deprecated String name]);
+  const isInstanceOf();
 
   bool matches(obj, Map matchState) => obj is T;
 
diff --git a/lib/src/description.dart b/lib/src/description.dart
index 1da5a3a..17c5ad4 100644
--- a/lib/src/description.dart
+++ b/lib/src/description.dart
@@ -2,8 +2,6 @@
 // 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.description;
-
 import 'interfaces.dart';
 import 'pretty_print.dart';
 
diff --git a/lib/src/error_matchers.dart b/lib/src/error_matchers.dart
index 821e731..1f37538 100644
--- a/lib/src/error_matchers.dart
+++ b/lib/src/error_matchers.dart
@@ -2,8 +2,6 @@
 // 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.error_matchers;
-
 import 'core_matchers.dart';
 import 'interfaces.dart';
 
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/interfaces.dart b/lib/src/interfaces.dart
index 984d862..0183671 100644
--- a/lib/src/interfaces.dart
+++ b/lib/src/interfaces.dart
@@ -2,8 +2,6 @@
 // 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.interfaces;
-
 // To decouple the reporting of errors, and allow for extensibility of
 // matchers, we make use of some interfaces.
 
diff --git a/lib/src/iterable_matchers.dart b/lib/src/iterable_matchers.dart
index 7185e92..55724b7 100644
--- a/lib/src/iterable_matchers.dart
+++ b/lib/src/iterable_matchers.dart
@@ -2,8 +2,6 @@
 // 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.iterable_matchers;
-
 import 'core_matchers.dart';
 import 'description.dart';
 import 'interfaces.dart';
diff --git a/lib/src/map_matchers.dart b/lib/src/map_matchers.dart
index 8facbf5..a44148f 100644
--- a/lib/src/map_matchers.dart
+++ b/lib/src/map_matchers.dart
@@ -2,8 +2,6 @@
 // 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.map_matchers;
-
 import 'interfaces.dart';
 import 'util.dart';
 
diff --git a/lib/src/numeric_matchers.dart b/lib/src/numeric_matchers.dart
index 770999d..0cdb98c 100644
--- a/lib/src/numeric_matchers.dart
+++ b/lib/src/numeric_matchers.dart
@@ -2,8 +2,6 @@
 // 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.numeric_matchers;
-
 import 'interfaces.dart';
 
 /// Returns a matcher which matches if the match argument is greater
diff --git a/lib/src/operator_matchers.dart b/lib/src/operator_matchers.dart
index 6d2e1fe..5d6baed 100644
--- a/lib/src/operator_matchers.dart
+++ b/lib/src/operator_matchers.dart
@@ -2,8 +2,6 @@
 // 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.operator_matchers;
-
 import 'interfaces.dart';
 import 'util.dart';
 
diff --git a/lib/src/pretty_print.dart b/lib/src/pretty_print.dart
index c20102b..9b0a789 100644
--- a/lib/src/pretty_print.dart
+++ b/lib/src/pretty_print.dart
@@ -2,8 +2,6 @@
 // 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.pretty_print;
-
 import 'description.dart';
 import 'interfaces.dart';
 import 'util.dart';
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/string_matchers.dart b/lib/src/string_matchers.dart
index 4643434..eb0b464 100644
--- a/lib/src/string_matchers.dart
+++ b/lib/src/string_matchers.dart
@@ -2,8 +2,6 @@
 // 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.string_matchers;
-
 import 'interfaces.dart';
 
 /// Returns a matcher which matches if the match argument is a string and
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/lib/src/util.dart b/lib/src/util.dart
index a6b3ab4..112819b 100644
--- a/lib/src/util.dart
+++ b/lib/src/util.dart
@@ -2,8 +2,6 @@
 // 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.util;
-
 import 'core_matchers.dart';
 import 'interfaces.dart';
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 3a21c1b..3697fe6 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,9 +1,9 @@
 name: matcher
-version: 0.11.4+6
+version: 0.12.0+2
 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'
+  test: '>=0.12.0 <0.13.0'
diff --git a/test/core_matchers_test.dart b/test/core_matchers_test.dart
index 5cd17da..4d0e4bf 100644
--- a/test/core_matchers_test.dart
+++ b/test/core_matchers_test.dart
@@ -2,16 +2,12 @@
 // 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 'package:test/test.dart' show test, group;
 
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('isTrue', () {
     shouldPass(true, isTrue);
     shouldFail(false, isTrue, "Expected: true Actual: <false>");
@@ -106,8 +102,7 @@
   test('returnsNormally', () {
     shouldPass(doesNotThrow, returnsNormally);
     shouldFail(doesThrow, returnsNormally, matches(r"Expected: return normally"
-        r"  Actual: <Closure(: \(\) => dynamic "
-        r"from Function 'doesThrow': static\.)?>"
+        r"  Actual: <Closure.*>"
         r"   Which: threw 'X'"));
   });
 
@@ -117,10 +112,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 +184,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/escape_test.dart b/test/escape_test.dart
index db1a7a8..265e24a 100644
--- a/test/escape_test.dart
+++ b/test/escape_test.dart
@@ -2,10 +2,8 @@
 // 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.escape_test;
-
 import 'package:matcher/src/util.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 void main() {
   group('escaping should work with', () {
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..4d302c2 100644
--- a/test/iterable_matchers_test.dart
+++ b/test/iterable_matchers_test.dart
@@ -2,16 +2,12 @@
 // 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.iterable_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
+import 'package:test/test.dart' show test, group;
 
 import 'test_utils.dart';
 
 void main() {
-  initUtils();
-
   test('isEmpty', () {
     shouldPass([], isEmpty);
     shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
@@ -163,4 +159,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..5aa6a75 100644
--- a/test/mirror_matchers_test.dart
+++ b/test/mirror_matchers_test.dart
@@ -2,10 +2,8 @@
 // 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.mirror_test;
-
 import 'package:matcher/mirror_matchers.dart';
-import 'package:unittest/unittest.dart' show test;
+import 'package:test/test.dart' show test;
 
 import 'test_utils.dart';
 
@@ -17,8 +15,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..922f303 100644
--- a/test/numeric_matchers_test.dart
+++ b/test/numeric_matchers_test.dart
@@ -2,16 +2,12 @@
 // 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.numeric_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
+import 'package:test/test.dart' show test, group;
 
 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..9fe77fb 100644
--- a/test/operator_matchers_test.dart
+++ b/test/operator_matchers_test.dart
@@ -2,16 +2,13 @@
 // 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.operator_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
+import 'package:test/test.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..c71a94f 100644
--- a/test/pretty_print_test.dart
+++ b/test/pretty_print_test.dart
@@ -2,11 +2,25 @@
 // 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.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:test/test.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', () {
@@ -14,7 +28,7 @@
     expect(prettyPrint(12.13), equals('<12.13>'));
     expect(prettyPrint(true), equals('<true>'));
     expect(prettyPrint(null), equals('<null>'));
-    expect(prettyPrint(() => 12), matches(r'<Closure(: \(\) => dynamic)?>'));
+    expect(prettyPrint(() => 12), matches(r'<Closure.*>'));
   });
 
   group('with a string', () {
@@ -191,4 +205,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..9a61cb0 100644
--- a/test/string_matchers_test.dart
+++ b/test/string_matchers_test.dart
@@ -2,16 +2,12 @@
 // 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.string_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, group;
+import 'package:test/test.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..ffcb623 100644
--- a/test/test_utils.dart
+++ b/test/test_utils.dart
@@ -2,38 +2,19 @@
 // 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_utils;
+import 'dart:collection';
 
-import 'dart:async';
+import 'package:test/test.dart';
 
-import 'package:matcher/matcher.dart';
-import 'package:unittest/unittest.dart' show test, expectAsync;
+void shouldFail(value, Matcher matcher, expected) {
+  var failed = false;
+  try {
+    expect(value, matcher);
+  } on TestFailure catch (err) {
+    failed = true;
 
-int _errorCount;
-String _errorString;
-FailureHandler _testHandler = null;
+    var _errorString = err.message;
 
-class MyFailureHandler extends DefaultFailureHandler {
-  void fail(String reason) {
-    ++_errorCount;
-    _errorString = reason;
-  }
-}
-
-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 +22,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 +34,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;
-  }
-}
