diff --git a/analysis_options.yaml b/analysis_options.yaml
index 24a615c..82ef545 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -4,3 +4,5 @@
 linter:
   rules:
     - prefer_typing_uninitialized_variables
+    - unnecessary_new
+    - unnecessary_const
diff --git a/lib/src/async_cache.dart b/lib/src/async_cache.dart
index 53084ca..6bd34bd 100644
--- a/lib/src/async_cache.dart
+++ b/lib/src/async_cache.dart
@@ -49,7 +49,7 @@
   /// An ephemeral cache guarantees that a callback function will only be
   /// executed at most once concurrently. This is useful for requests for which
   /// data is updated frequently but stale data is acceptable.
-  factory AsyncCache.ephemeral() => new AsyncCache(Duration.zero);
+  factory AsyncCache.ephemeral() => AsyncCache(Duration.zero);
 
   /// Returns a cached value from a previous call to [fetch], or runs [callback]
   /// to compute a new one.
@@ -58,7 +58,7 @@
   /// value. Otherwise, runs [callback] and returns its new return value.
   Future<T> fetch(Future<T> callback()) async {
     if (_cachedStreamSplitter != null) {
-      throw new StateError('Previously used to cache via `fetchStream`');
+      throw StateError('Previously used to cache via `fetchStream`');
     }
     if (_cachedValueFuture == null) {
       _cachedValueFuture = callback();
@@ -76,11 +76,11 @@
   /// return value.
   Stream<T> fetchStream(Stream<T> callback()) {
     if (_cachedValueFuture != null) {
-      throw new StateError('Previously used to cache via `fetch`');
+      throw StateError('Previously used to cache via `fetch`');
     }
     if (_cachedStreamSplitter == null) {
-      _cachedStreamSplitter = new StreamSplitter(callback()
-          .transform(new StreamTransformer.fromHandlers(handleDone: (sink) {
+      _cachedStreamSplitter = StreamSplitter(callback()
+          .transform(StreamTransformer.fromHandlers(handleDone: (sink) {
         _startStaleTimer();
         sink.close();
       })));
@@ -100,6 +100,6 @@
   }
 
   void _startStaleTimer() {
-    _stale = new Timer(_duration, invalidate);
+    _stale = Timer(_duration, invalidate);
   }
 }
diff --git a/lib/src/async_memoizer.dart b/lib/src/async_memoizer.dart
index d1c0f32..5e83400 100644
--- a/lib/src/async_memoizer.dart
+++ b/lib/src/async_memoizer.dart
@@ -31,7 +31,7 @@
   ///
   /// This can be accessed at any time, and will fire once [runOnce] is called.
   Future<T> get future => _completer.future;
-  final _completer = new Completer<T>();
+  final _completer = Completer<T>();
 
   /// Whether [runOnce] has been called yet.
   bool get hasRun => _completer.isCompleted;
@@ -40,7 +40,7 @@
   ///
   /// If [runOnce] has already been called, this returns the original result.
   Future<T> runOnce(FutureOr<T> computation()) {
-    if (!hasRun) _completer.complete(new Future.sync(computation));
+    if (!hasRun) _completer.complete(Future.sync(computation));
     return future;
   }
 }
diff --git a/lib/src/byte_collector.dart b/lib/src/byte_collector.dart
index 3c1d49d..f01cc2a 100644
--- a/lib/src/byte_collector.dart
+++ b/lib/src/byte_collector.dart
@@ -31,7 +31,7 @@
     Stream<List<int>> source) {
   return _collectBytes(
       source,
-      (subscription, result) => new CancelableOperation.fromFuture(result,
+      (subscription, result) => CancelableOperation.fromFuture(result,
           onCancel: subscription.cancel));
 }
 
@@ -46,7 +46,7 @@
         StreamSubscription<List<int>> subscription, Future<Uint8List> result)) {
   var byteLists = <List<int>>[];
   var length = 0;
-  var completer = new Completer<Uint8List>.sync();
+  var completer = Completer<Uint8List>.sync();
   var subscription = source.listen(
       (bytes) {
         byteLists.add(bytes);
@@ -62,7 +62,7 @@
 
 // Join a lists of bytes with a known total length into a single [Uint8List].
 Uint8List _collect(int length, List<List<int>> byteLists) {
-  var result = new Uint8List(length);
+  var result = Uint8List(length);
   int i = 0;
   for (var byteList in byteLists) {
     var end = i + byteList.length;
diff --git a/lib/src/cancelable_operation.dart b/lib/src/cancelable_operation.dart
index 0e010da..e6115cb 100644
--- a/lib/src/cancelable_operation.dart
+++ b/lib/src/cancelable_operation.dart
@@ -31,7 +31,7 @@
   /// It's guaranteed to only be called once.
   factory CancelableOperation.fromFuture(Future<T> inner,
       {FutureOr onCancel()}) {
-    var completer = new CancelableCompleter<T>(onCancel: onCancel);
+    var completer = CancelableCompleter<T>(onCancel: onCancel);
     completer.complete(inner);
     return completer.operation;
   }
@@ -45,7 +45,7 @@
   /// canceled, this is as well.
   Stream<T> asStream() {
     var controller =
-        new StreamController<T>(sync: true, onCancel: _completer._cancel);
+        StreamController<T>(sync: true, onCancel: _completer._cancel);
 
     value.then((value) {
       controller.add(value);
@@ -64,7 +64,7 @@
   /// If this operation is cancelled, the returned future waits for the future
   /// returned by [cancel], then completes to [cancellationValue].
   Future<T> valueOrCancellation([T cancellationValue]) {
-    var completer = new Completer<T>.sync();
+    var completer = Completer<T>.sync();
     value.then((result) => completer.complete(result),
         onError: completer.completeError);
 
@@ -100,8 +100,8 @@
   /// It's guaranteed to only be called once.
   CancelableCompleter({FutureOr onCancel()})
       : _onCancel = onCancel,
-        _inner = new Completer<T>() {
-    _operation = new CancelableOperation<T>._(this);
+        _inner = Completer<T>() {
+    _operation = CancelableOperation<T>._(this);
   }
 
   /// The operation controlled by this completer.
@@ -117,14 +117,14 @@
   bool _isCanceled = false;
 
   /// The memoizer for [_cancel].
-  final _cancelMemo = new AsyncMemoizer();
+  final _cancelMemo = AsyncMemoizer();
 
   /// Completes [operation] to [value].
   ///
   /// If [value] is a [Future], this will complete to the result of that
   /// [Future] once it completes.
   void complete([value]) {
-    if (_isCompleted) throw new StateError("Operation already completed");
+    if (_isCompleted) throw StateError("Operation already completed");
     _isCompleted = true;
 
     if (value is! Future) {
@@ -150,7 +150,7 @@
 
   /// Completes [operation] to [error].
   void completeError(Object error, [StackTrace stackTrace]) {
-    if (_isCompleted) throw new StateError("Operation already completed");
+    if (_isCompleted) throw StateError("Operation already completed");
     _isCompleted = true;
 
     if (_isCanceled) return;
@@ -159,7 +159,7 @@
 
   /// Cancel the completer.
   Future _cancel() {
-    if (_inner.isCompleted) return new Future.value();
+    if (_inner.isCompleted) return Future.value();
 
     return _cancelMemo.runOnce(() {
       _isCanceled = true;
diff --git a/lib/src/delegate/event_sink.dart b/lib/src/delegate/event_sink.dart
index 54c3e52..95d7841 100644
--- a/lib/src/delegate/event_sink.dart
+++ b/lib/src/delegate/event_sink.dart
@@ -23,7 +23,7 @@
   /// [add] may throw a [CastError] if the argument type doesn't match the
   /// reified type of [sink].
   static EventSink<T> typed<T>(EventSink sink) =>
-      sink is EventSink<T> ? sink : new DelegatingEventSink._(sink);
+      sink is EventSink<T> ? sink : DelegatingEventSink._(sink);
 
   void add(T data) {
     _sink.add(data);
diff --git a/lib/src/delegate/sink.dart b/lib/src/delegate/sink.dart
index 7c68a0f..b8ba76d 100644
--- a/lib/src/delegate/sink.dart
+++ b/lib/src/delegate/sink.dart
@@ -21,7 +21,7 @@
   /// throw a [CastError] if the argument type doesn't match the reified type of
   /// [sink].
   static Sink<T> typed<T>(Sink sink) =>
-      sink is Sink<T> ? sink : new DelegatingSink._(sink);
+      sink is Sink<T> ? sink : DelegatingSink._(sink);
 
   void add(T data) {
     _sink.add(data);
diff --git a/lib/src/delegate/stream_consumer.dart b/lib/src/delegate/stream_consumer.dart
index ba83040..ad53182 100644
--- a/lib/src/delegate/stream_consumer.dart
+++ b/lib/src/delegate/stream_consumer.dart
@@ -25,7 +25,7 @@
   static StreamConsumer<T> typed<T>(StreamConsumer consumer) =>
       consumer is StreamConsumer<T>
           ? consumer
-          : new DelegatingStreamConsumer._(consumer);
+          : DelegatingStreamConsumer._(consumer);
 
   Future addStream(Stream<T> stream) => _consumer.addStream(stream);
 
diff --git a/lib/src/delegate/stream_sink.dart b/lib/src/delegate/stream_sink.dart
index 198df8a..67eb33c 100644
--- a/lib/src/delegate/stream_sink.dart
+++ b/lib/src/delegate/stream_sink.dart
@@ -25,7 +25,7 @@
   /// throw a [CastError] if the argument type doesn't match the reified type of
   /// [sink].
   static StreamSink<T> typed<T>(StreamSink sink) =>
-      sink is StreamSink<T> ? sink : new DelegatingStreamSink._(sink);
+      sink is StreamSink<T> ? sink : DelegatingStreamSink._(sink);
 
   void add(T data) {
     _sink.add(data);
diff --git a/lib/src/delegate/stream_subscription.dart b/lib/src/delegate/stream_subscription.dart
index 6bef924..07af08e 100644
--- a/lib/src/delegate/stream_subscription.dart
+++ b/lib/src/delegate/stream_subscription.dart
@@ -26,7 +26,7 @@
   static StreamSubscription<T> typed<T>(StreamSubscription subscription) =>
       subscription is StreamSubscription<T>
           ? subscription
-          : new TypeSafeStreamSubscription<T>(subscription);
+          : TypeSafeStreamSubscription<T>(subscription);
 
   void onData(void handleData(T data)) {
     _source.onData(handleData);
diff --git a/lib/src/future_group.dart b/lib/src/future_group.dart
index 0bf3158..7e17494 100644
--- a/lib/src/future_group.dart
+++ b/lib/src/future_group.dart
@@ -31,7 +31,7 @@
   /// This will also complete with an error if any of the futures in the group
   /// fails, regardless of whether [close] was called.
   Future<List<T>> get future => _completer.future;
-  final _completer = new Completer<List<T>>();
+  final _completer = Completer<List<T>>();
 
   /// Whether this group has no pending futures.
   bool get isIdle => _pending == 0;
@@ -43,7 +43,7 @@
   /// called, this stream will close.
   Stream get onIdle {
     if (_onIdleController == null) {
-      _onIdleController = new StreamController.broadcast(sync: true);
+      _onIdleController = StreamController.broadcast(sync: true);
     }
     return _onIdleController.stream;
   }
@@ -54,11 +54,11 @@
   /// the order they were added.
   ///
   /// The slots for futures that haven't completed yet are `null`.
-  final _values = new List<T>();
+  final _values = List<T>();
 
   /// Wait for [task] to complete.
   void add(Future<T> task) {
-    if (_closed) throw new StateError("The FutureGroup is closed.");
+    if (_closed) throw StateError("The FutureGroup is closed.");
 
     // Ensure that future values are put into [values] in the same order they're
     // added to the group by pre-allocating a slot for them and recording its
diff --git a/lib/src/lazy_stream.dart b/lib/src/lazy_stream.dart
index f07c387..278957a 100644
--- a/lib/src/lazy_stream.dart
+++ b/lib/src/lazy_stream.dart
@@ -22,13 +22,13 @@
   /// a listener and forwards to the returned stream.
   LazyStream(FutureOr<Stream<T>> callback()) : _callback = callback {
     // Explicitly check for null because we null out [_callback] internally.
-    if (_callback == null) throw new ArgumentError.notNull('callback');
+    if (_callback == null) throw ArgumentError.notNull('callback');
   }
 
   StreamSubscription<T> listen(void onData(T event),
       {Function onError, void onDone(), bool cancelOnError}) {
     if (_callback == null) {
-      throw new StateError("Stream has already been listened to.");
+      throw StateError("Stream has already been listened to.");
     }
 
     // Null out the callback before we invoke it to ensure that even while
diff --git a/lib/src/null_stream_sink.dart b/lib/src/null_stream_sink.dart
index c83790c..c9d3d5d 100644
--- a/lib/src/null_stream_sink.dart
+++ b/lib/src/null_stream_sink.dart
@@ -42,13 +42,13 @@
   ///
   /// If [done] is passed, it's used as the [Sink.done] future. Otherwise, a
   /// completed future is used.
-  NullStreamSink({Future done}) : done = done ?? new Future.value();
+  NullStreamSink({Future done}) : done = done ?? Future.value();
 
   /// Creates a null sink whose [done] future emits [error].
   ///
   /// Note that this error will not be considered uncaught.
   NullStreamSink.error(error, [StackTrace stackTrace])
-      : done = new Future.error(error, stackTrace)
+      : done = Future.error(error, stackTrace)
           // Don't top-level the error. This gives the user a change to call
           // [close] or [done], and matches the behavior of a remote endpoint
           // experiencing an error.
@@ -66,7 +66,7 @@
     _checkEventAllowed();
 
     _addingStream = true;
-    var future = stream.listen(null).cancel() ?? new Future.value();
+    var future = stream.listen(null).cancel() ?? Future.value();
     return future.whenComplete(() {
       _addingStream = false;
     });
@@ -75,9 +75,9 @@
   /// Throws a [StateError] if [close] has been called or an [addStream] call is
   /// pending.
   void _checkEventAllowed() {
-    if (_closed) throw new StateError("Cannot add to a closed sink.");
+    if (_closed) throw StateError("Cannot add to a closed sink.");
     if (_addingStream) {
-      throw new StateError("Cannot add to a sink while adding a stream.");
+      throw StateError("Cannot add to a sink while adding a stream.");
     }
   }
 
diff --git a/lib/src/restartable_timer.dart b/lib/src/restartable_timer.dart
index 7b05821..b8e414a 100644
--- a/lib/src/restartable_timer.dart
+++ b/lib/src/restartable_timer.dart
@@ -26,7 +26,7 @@
   /// The [callback] function is invoked after the given [duration]. Unlike a
   /// normal non-periodic [Timer], [callback] may be called more than once.
   RestartableTimer(this._duration, this._callback) {
-    _timer = new Timer(_duration, _callback);
+    _timer = Timer(_duration, _callback);
   }
 
   bool get isActive => _timer.isActive;
@@ -37,7 +37,7 @@
   /// This restarts the timer even if it has already fired or has been canceled.
   void reset() {
     _timer.cancel();
-    _timer = new Timer(_duration, _callback);
+    _timer = Timer(_duration, _callback);
   }
 
   void cancel() {
@@ -49,6 +49,6 @@
   // See https://github.com/dart-lang/sdk/issues/31664
   // ignore: override_on_non_overriding_getter
   int get tick {
-    throw new UnimplementedError("tick");
+    throw UnimplementedError("tick");
   }
 }
diff --git a/lib/src/result/capture_sink.dart b/lib/src/result/capture_sink.dart
index 742c160..0477a19 100644
--- a/lib/src/result/capture_sink.dart
+++ b/lib/src/result/capture_sink.dart
@@ -13,11 +13,11 @@
   CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
 
   void add(T value) {
-    _sink.add(new Result<T>.value(value));
+    _sink.add(Result<T>.value(value));
   }
 
   void addError(Object error, [StackTrace stackTrace]) {
-    _sink.add(new Result.error(error, stackTrace));
+    _sink.add(Result.error(error, stackTrace));
   }
 
   void close() {
diff --git a/lib/src/result/capture_transformer.dart b/lib/src/result/capture_transformer.dart
index b9a538a..a727a8e 100644
--- a/lib/src/result/capture_transformer.dart
+++ b/lib/src/result/capture_transformer.dart
@@ -15,6 +15,6 @@
   const CaptureStreamTransformer();
 
   Stream<Result<T>> bind(Stream<T> source) =>
-      new Stream<Result<T>>.eventTransformed(
-          source, (sink) => new CaptureSink<T>(sink));
+      Stream<Result<T>>.eventTransformed(
+          source, (sink) => CaptureSink<T>(sink));
 }
diff --git a/lib/src/result/error.dart b/lib/src/result/error.dart
index 2feb2c2..8f29d13 100644
--- a/lib/src/result/error.dart
+++ b/lib/src/result/error.dart
@@ -30,7 +30,7 @@
     sink.addError(error, stackTrace);
   }
 
-  Future<Null> get asFuture => new Future<Null>.error(error, stackTrace);
+  Future<Null> get asFuture => Future<Null>.error(error, stackTrace);
 
   /// Calls an error handler with the error and stacktrace.
   ///
diff --git a/lib/src/result/release_transformer.dart b/lib/src/result/release_transformer.dart
index 01865cc..1aead30 100644
--- a/lib/src/result/release_transformer.dart
+++ b/lib/src/result/release_transformer.dart
@@ -12,9 +12,9 @@
   const ReleaseStreamTransformer();
 
   Stream<T> bind(Stream<Result<T>> source) {
-    return new Stream<T>.eventTransformed(source, _createSink);
+    return Stream<T>.eventTransformed(source, _createSink);
   }
 
   // Since Stream.eventTransformed is not generic, this method can be static.
-  static EventSink<Result> _createSink(EventSink sink) => new ReleaseSink(sink);
+  static EventSink<Result> _createSink(EventSink sink) => ReleaseSink(sink);
 }
diff --git a/lib/src/result/result.dart b/lib/src/result/result.dart
index 25503b5..28799fa 100644
--- a/lib/src/result/result.dart
+++ b/lib/src/result/result.dart
@@ -28,14 +28,14 @@
   /// The result of the transformation is a stream of [Result] values and no
   /// error events. This is the transformer used by [captureStream].
   static const StreamTransformer<Object, Result<Object>>
-      captureStreamTransformer = const CaptureStreamTransformer<Object>();
+      captureStreamTransformer = CaptureStreamTransformer<Object>();
 
   /// A stream transformer that releases a stream of result events.
   ///
   /// The result of the transformation is a stream of values and error events.
   /// This is the transformer used by [releaseStream].
   static const StreamTransformer<Result<Object>, Object>
-      releaseStreamTransformer = const ReleaseStreamTransformer<Object>();
+      releaseStreamTransformer = ReleaseStreamTransformer<Object>();
 
   /// A sink transformer that captures events into [Result]s.
   ///
@@ -43,8 +43,8 @@
   /// values and no error events.
   static const StreamSinkTransformer<Object, Result<Object>>
       captureSinkTransformer =
-      const StreamSinkTransformer<Object, Result<Object>>.fromStreamTransformer(
-          const CaptureStreamTransformer<Object>());
+      StreamSinkTransformer<Object, Result<Object>>.fromStreamTransformer(
+          CaptureStreamTransformer<Object>());
 
   /// A sink transformer that releases result events.
   ///
@@ -52,8 +52,8 @@
   /// error events.
   static const StreamSinkTransformer<Result<Object>, Object>
       releaseSinkTransformer =
-      const StreamSinkTransformer<Result<Object>, Object>.fromStreamTransformer(
-          const ReleaseStreamTransformer<Object>());
+      StreamSinkTransformer<Result<Object>, Object>.fromStreamTransformer(
+          ReleaseStreamTransformer<Object>());
 
   /// Creates a `Result` with the result of calling [computation].
   ///
@@ -62,9 +62,9 @@
   /// the call.
   factory Result(T computation()) {
     try {
-      return new ValueResult<T>(computation());
+      return ValueResult<T>(computation());
     } catch (e, s) {
-      return new ErrorResult(e, s);
+      return ErrorResult(e, s);
     }
   }
 
@@ -77,15 +77,15 @@
   ///
   /// Alias for [ErrorResult.ErrorResult].
   factory Result.error(Object error, [StackTrace stackTrace]) =>
-      new ErrorResult(error, stackTrace);
+      ErrorResult(error, stackTrace);
 
   /// Captures the result of a future into a `Result` future.
   ///
   /// The resulting future will never have an error.
   /// Errors have been converted to an [ErrorResult] value.
   static Future<Result<T>> capture<T>(Future<T> future) {
-    return future.then((value) => new ValueResult(value),
-        onError: (error, stackTrace) => new ErrorResult(error, stackTrace));
+    return future.then((value) => ValueResult(value),
+        onError: (error, stackTrace) => ErrorResult(error, stackTrace));
   }
 
   /// Captures each future in [elements],
@@ -111,13 +111,13 @@
           }
         });
       } else {
-        results.add(new Result<T>.value(element));
+        results.add(Result<T>.value(element));
       }
     }
     if (pending == 0) {
-      return new Future<List<Result<T>>>.value(results);
+      return Future<List<Result<T>>>.value(results);
     }
-    completer = new Completer<List<Result<T>>>();
+    completer = Completer<List<Result<T>>>();
     return completer.future;
   }
 
@@ -136,7 +136,7 @@
   /// The returned stream will not have any error events.
   /// Errors from the source stream have been converted to [ErrorResult]s.
   static Stream<Result<T>> captureStream<T>(Stream<T> source) =>
-      source.transform(new CaptureStreamTransformer<T>());
+      source.transform(CaptureStreamTransformer<T>());
 
   /// Releases a stream of [result] values into a stream of the results.
   ///
@@ -144,7 +144,7 @@
   /// the returned stream as appropriate.
   /// Errors from the source stream become errors in the returned stream.
   static Stream<T> releaseStream<T>(Stream<Result<T>> source) =>
-      source.transform(new ReleaseStreamTransformer<T>());
+      source.transform(ReleaseStreamTransformer<T>());
 
   /// Releases results added to the returned sink as data and errors on [sink].
   ///
@@ -152,7 +152,7 @@
   /// on [sink]. Errors added to the returned sink are forwarded directly to
   /// [sink] and so is the [EventSink.close] calls.
   static EventSink<Result<T>> releaseSink<T>(EventSink<T> sink) =>
-      new ReleaseSink<T>(sink);
+      ReleaseSink<T>(sink);
 
   /// Captures the events of the returned sink into results on [sink].
   ///
@@ -162,7 +162,7 @@
   ///
   /// When the returned sink is closed, so is [sink].
   static EventSink<T> captureSink<T>(EventSink<Result<T>> sink) =>
-      new CaptureSink<T>(sink);
+      CaptureSink<T>(sink);
 
   /// Converts a result of a result to a single result.
   ///
@@ -188,7 +188,7 @@
         return result.asError;
       }
     }
-    return new Result<List<T>>.value(values);
+    return Result<List<T>>.value(values);
   }
 
   /// Whether this result is a value result.
diff --git a/lib/src/result/value.dart b/lib/src/result/value.dart
index edc41fb..dddc9fe 100644
--- a/lib/src/result/value.dart
+++ b/lib/src/result/value.dart
@@ -27,7 +27,7 @@
     sink.add(value);
   }
 
-  Future<T> get asFuture => new Future.value(value);
+  Future<T> get asFuture => Future.value(value);
 
   int get hashCode => value.hashCode ^ 0x323f1d61;
 
diff --git a/lib/src/single_subscription_transformer.dart b/lib/src/single_subscription_transformer.dart
index ff17189..8007a42 100644
--- a/lib/src/single_subscription_transformer.dart
+++ b/lib/src/single_subscription_transformer.dart
@@ -18,8 +18,8 @@
 
   Stream<T> bind(Stream<S> stream) {
     StreamSubscription<S> subscription;
-    var controller = new StreamController<T>(
-        sync: true, onCancel: () => subscription.cancel());
+    var controller =
+        StreamController<T>(sync: true, onCancel: () => subscription.cancel());
     subscription = stream.listen((value) {
       // TODO(nweiz): When we release a new major version, get rid of the second
       // type parameter and avoid this conversion.
diff --git a/lib/src/stream_completer.dart b/lib/src/stream_completer.dart
index 4311de5..bbb2155 100644
--- a/lib/src/stream_completer.dart
+++ b/lib/src/stream_completer.dart
@@ -24,7 +24,7 @@
 /// the listen is performed directly on the source stream.
 class StreamCompleter<T> {
   /// The stream doing the actual work, is returned by [stream].
-  final _stream = new _CompleterStream<T>();
+  final _stream = _CompleterStream<T>();
 
   /// Convert a `Future<Stream>` to a `Stream`.
   ///
@@ -35,7 +35,7 @@
   /// If the future completes with an error, the returned stream will
   /// instead contain just that error.
   static Stream<T> fromFuture<T>(Future<Stream<T>> streamFuture) {
-    var completer = new StreamCompleter<T>();
+    var completer = StreamCompleter<T>();
     streamFuture.then(completer.setSourceStream, onError: completer.setError);
     return completer.stream;
   }
@@ -75,7 +75,7 @@
   /// most once. Trying to call any of them again will fail.
   void setSourceStream(Stream<T> sourceStream) {
     if (_stream._isSourceStreamSet) {
-      throw new StateError("Source stream already set");
+      throw StateError("Source stream already set");
     }
     _stream._setSourceStream(sourceStream);
   }
@@ -86,7 +86,7 @@
   /// most once. Trying to call any of them again will fail.
   void setEmpty() {
     if (_stream._isSourceStreamSet) {
-      throw new StateError("Source stream already set");
+      throw StateError("Source stream already set");
     }
     _stream._setEmpty();
   }
@@ -98,7 +98,7 @@
   /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
   /// most once. Trying to call any of them again will fail.
   void setError(error, [StackTrace stackTrace]) {
-    setSourceStream(new Stream.fromFuture(new Future.error(error, stackTrace)));
+    setSourceStream(Stream.fromFuture(Future.error(error, stackTrace)));
   }
 }
 
@@ -179,6 +179,6 @@
   // Creates the [_controller].
   void _createController() {
     assert(_controller == null);
-    _controller = new StreamController<T>(sync: true);
+    _controller = StreamController<T>(sync: true);
   }
 }
diff --git a/lib/src/stream_group.dart b/lib/src/stream_group.dart
index 6361a5c..d647ce3 100644
--- a/lib/src/stream_group.dart
+++ b/lib/src/stream_group.dart
@@ -47,14 +47,14 @@
   /// subscriptions will be canceled and set to null again. Single-subscriber
   /// stream subscriptions will be left intact, since they can't be
   /// re-subscribed.
-  final _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+  final _subscriptions = Map<Stream<T>, StreamSubscription<T>>();
 
   /// Merges the events from [streams] into a single (single-subscriber) stream.
   ///
   /// This is equivalent to adding [streams] to a group, closing that group, and
   /// returning its stream.
   static Stream<T> merge<T>(Iterable<Stream<T>> streams) {
-    var group = new StreamGroup<T>();
+    var group = StreamGroup<T>();
     streams.forEach(group.add);
     group.close();
     return group.stream;
@@ -62,7 +62,7 @@
 
   /// Creates a new stream group where [stream] is single-subscriber.
   StreamGroup() {
-    _controller = new StreamController<T>(
+    _controller = StreamController<T>(
         onListen: _onListen,
         onPause: _onPause,
         onResume: _onResume,
@@ -72,7 +72,7 @@
 
   /// Creates a new stream group where [stream] is a broadcast stream.
   StreamGroup.broadcast() {
-    _controller = new StreamController<T>.broadcast(
+    _controller = StreamController<T>.broadcast(
         onListen: _onListen, onCancel: _onCancelBroadcast, sync: true);
   }
 
@@ -90,7 +90,7 @@
   /// Throws a [StateError] if this group is closed.
   Future add(Stream<T> stream) {
     if (_closed) {
-      throw new StateError("Can't add a Stream to a closed StreamGroup.");
+      throw StateError("Can't add a Stream to a closed StreamGroup.");
     }
 
     if (_state == _StreamGroupState.dormant) {
@@ -219,12 +219,12 @@
   ///
   /// New streams added to the group will be listened once the group has a
   /// listener.
-  static const dormant = const _StreamGroupState("dormant");
+  static const dormant = _StreamGroupState("dormant");
 
   /// The group has one or more listeners and is actively firing events.
   ///
   /// New streams added to the group will be immediately listeners.
-  static const listening = const _StreamGroupState("listening");
+  static const listening = _StreamGroupState("listening");
 
   /// The group is paused and no more events will be fired until it resumes.
   ///
@@ -232,7 +232,7 @@
   /// will be resumed once the group itself is resumed.
   ///
   /// This state is only used by single-subscriber groups.
-  static const paused = const _StreamGroupState("paused");
+  static const paused = _StreamGroupState("paused");
 
   /// The group is canceled and no more events will be fired ever.
   ///
@@ -240,7 +240,7 @@
   /// discarded.
   ///
   /// This state is only used by single-subscriber groups.
-  static const canceled = const _StreamGroupState("canceled");
+  static const canceled = _StreamGroupState("canceled");
 
   /// The name of the state.
   ///
diff --git a/lib/src/stream_queue.dart b/lib/src/stream_queue.dart
index 61a1654..fd3186e 100644
--- a/lib/src/stream_queue.dart
+++ b/lib/src/stream_queue.dart
@@ -44,7 +44,7 @@
 ///
 /// Example:
 ///
-///     var events = new StreamQueue<String>(someStreamOfLines);
+///     var events = StreamQueue<String>(someStreamOfLines);
 ///     var first = await events.next;
 ///     while (first.startsWith('#')) {
 ///       // Skip comments.
@@ -107,12 +107,12 @@
   var _eventsReceived = 0;
 
   /// Queue of events not used by a request yet.
-  final QueueList<Result<T>> _eventQueue = new QueueList();
+  final QueueList<Result<T>> _eventQueue = QueueList();
 
   /// Queue of pending requests.
   ///
   /// Access through methods below to ensure consistency.
-  final Queue<_EventRequest> _requestQueue = new Queue();
+  final Queue<_EventRequest> _requestQueue = Queue();
 
   /// Create a `StreamQueue` of the events of [source].
   factory StreamQueue(Stream<T> source) => StreamQueue._(source);
@@ -133,7 +133,7 @@
   /// one events.
   Future<bool> get hasNext {
     if (!_isClosed) {
-      var hasNextRequest = new _HasNextRequest<T>();
+      var hasNextRequest = _HasNextRequest<T>();
       _addRequest(hasNextRequest);
       return hasNextRequest.future;
     }
@@ -146,9 +146,9 @@
   /// If one of the next [count] events is an error, the returned future
   /// completes with this error, and the error is still left in the queue.
   Future<List<T>> lookAhead(int count) {
-    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (count < 0) throw RangeError.range(count, 0, null, "count");
     if (!_isClosed) {
-      var request = new _LookAheadRequest<T>(count);
+      var request = _LookAheadRequest<T>(count);
       _addRequest(request);
       return request.future;
     }
@@ -171,7 +171,7 @@
   /// first events that were not consumed by previous requeusts.
   Future<T> get next {
     if (!_isClosed) {
-      var nextRequest = new _NextRequest<T>();
+      var nextRequest = _NextRequest<T>();
       _addRequest(nextRequest);
       return nextRequest.future;
     }
@@ -184,7 +184,7 @@
   /// If the next event is an error event, it stays in the queue.
   Future<T> get peek {
     if (!_isClosed) {
-      var nextRequest = new _PeekRequest<T>();
+      var nextRequest = _PeekRequest<T>();
       _addRequest(nextRequest);
       return nextRequest.future;
     }
@@ -204,7 +204,7 @@
     if (_isClosed) {
       throw _failClosed();
     }
-    var request = new _RestRequest<T>(this);
+    var request = _RestRequest<T>(this);
     _isClosed = true;
     _addRequest(request);
     return request.stream;
@@ -226,9 +226,9 @@
   /// then all events were succssfully skipped. If the value
   /// is greater than zero then the stream ended early.
   Future<int> skip(int count) {
-    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (count < 0) throw RangeError.range(count, 0, null, "count");
     if (!_isClosed) {
-      var request = new _SkipRequest<T>(count);
+      var request = _SkipRequest<T>(count);
       _addRequest(request);
       return request.future;
     }
@@ -251,9 +251,9 @@
   /// of data collected so far. That is, the returned
   /// list may have fewer than [count] elements.
   Future<List<T>> take(int count) {
-    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (count < 0) throw RangeError.range(count, 0, null, "count");
     if (!_isClosed) {
-      var request = new _TakeRequest<T>(count);
+      var request = _TakeRequest<T>(count);
       _addRequest(request);
       return request.future;
     }
@@ -295,7 +295,7 @@
   StreamQueueTransaction<T> startTransaction() {
     if (_isClosed) throw _failClosed();
 
-    var request = new _TransactionRequest(this);
+    var request = _TransactionRequest(this);
     _addRequest(request);
     return request.transaction;
   }
@@ -353,7 +353,7 @@
   /// See also [startTransaction] and [withTransaction].
   ///
   /// ```dart
-  /// final _stdinQueue = new StreamQueue(stdin);
+  /// final _stdinQueue = StreamQueue(stdin);
   ///
   /// /// Returns an operation that completes when the user sends a line to
   /// /// standard input.
@@ -365,7 +365,7 @@
   CancelableOperation<S> cancelable<S>(
       Future<S> callback(StreamQueue<T> queue)) {
     var transaction = startTransaction();
-    var completer = new CancelableCompleter<S>(onCancel: () {
+    var completer = CancelableCompleter<S>(onCancel: () {
       transaction.reject();
     });
 
@@ -393,17 +393,17 @@
   /// After calling `cancel`, no further events can be requested.
   /// None of [lookAhead], [next], [peek], [rest], [skip], [take] or [cancel]
   /// may be called again.
-  Future cancel({bool immediate: false}) {
+  Future cancel({bool immediate = false}) {
     if (_isClosed) throw _failClosed();
     _isClosed = true;
 
     if (!immediate) {
-      var request = new _CancelRequest<T>(this);
+      var request = _CancelRequest<T>(this);
       _addRequest(request);
       return request.future;
     }
 
-    if (_isDone && _eventQueue.isEmpty) return new Future.value();
+    if (_isDone && _eventQueue.isEmpty) return Future.value();
     return _cancel();
   }
 
@@ -444,7 +444,7 @@
   Stream<T> _extractStream() {
     assert(_isClosed);
     if (_isDone) {
-      return new Stream<T>.empty();
+      return Stream<T>.empty();
     }
     _isDone = true;
 
@@ -456,7 +456,7 @@
     _subscription = null;
 
     var wasPaused = subscription.isPaused;
-    var result = new SubscriptionStream<T>(subscription);
+    var result = SubscriptionStream<T>(subscription);
     // Resume after creating stream because that pauses the subscription too.
     // This way there won't be a short resumption in the middle.
     if (wasPaused) subscription.resume();
@@ -481,9 +481,9 @@
     if (_isDone) return;
     if (_subscription == null) {
       _subscription = _source.listen((data) {
-        _addResult(new Result.value(data));
+        _addResult(Result.value(data));
       }, onError: (error, StackTrace stackTrace) {
-        _addResult(new Result.error(error, stackTrace));
+        _addResult(Result.error(error, stackTrace));
       }, onDone: () {
         _subscription = null;
         this._close();
@@ -529,7 +529,7 @@
   /// Returns a [StateError] with a message saying that either
   /// [cancel] or [rest] have already been called.
   Error _failClosed() {
-    return new StateError("Already cancelled");
+    return StateError("Already cancelled");
   }
 
   /// Adds a new request to the queue.
@@ -558,7 +558,7 @@
   final StreamSplitter<T> _splitter;
 
   /// Queues created using [newQueue].
-  final _queues = new Set<StreamQueue>();
+  final _queues = Set<StreamQueue>();
 
   /// Whether [commit] has been called.
   var _committed = false;
@@ -567,7 +567,7 @@
   var _rejected = false;
 
   StreamQueueTransaction._(this._parent, Stream<T> source)
-      : _splitter = new StreamSplitter(source);
+      : _splitter = StreamSplitter(source);
 
   /// Creates a new copy of the parent queue.
   ///
@@ -575,7 +575,7 @@
   /// [StreamQueue.startTransaction] was called. Its position can be committed
   /// to the parent queue using [commit].
   StreamQueue<T> newQueue() {
-    var queue = new StreamQueue(_splitter.split());
+    var queue = StreamQueue(_splitter.split());
     _queues.add(queue);
     return queue;
   }
@@ -592,9 +592,9 @@
   void commit(StreamQueue<T> queue) {
     _assertActive();
     if (!_queues.contains(queue)) {
-      throw new ArgumentError("Queue doesn't belong to this transaction.");
+      throw ArgumentError("Queue doesn't belong to this transaction.");
     } else if (queue._requestQueue.isNotEmpty) {
-      throw new StateError("A queue with pending requests can't be committed.");
+      throw StateError("A queue with pending requests can't be committed.");
     }
     _committed = true;
 
@@ -639,9 +639,9 @@
   /// Throws a [StateError] if [accept] or [reject] has already been called.
   void _assertActive() {
     if (_committed) {
-      throw new StateError("This transaction has already been accepted.");
+      throw StateError("This transaction has already been accepted.");
     } else if (_rejected) {
-      throw new StateError("This transaction has already been rejected.");
+      throw StateError("This transaction has already been rejected.");
     }
   }
 }
@@ -690,7 +690,7 @@
 /// and is then complete.
 class _NextRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by [StreamQueue.next].
-  final _completer = new Completer<T>();
+  final _completer = Completer<T>();
 
   _NextRequest();
 
@@ -702,8 +702,7 @@
       return true;
     }
     if (isDone) {
-      _completer.completeError(
-          new StateError("No elements"), StackTrace.current);
+      _completer.completeError(StateError("No elements"), StackTrace.current);
       return true;
     }
     return false;
@@ -716,7 +715,7 @@
 /// and is then complete, but doesn't consume the event.
 class _PeekRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by [StreamQueue.next].
-  final _completer = new Completer<T>();
+  final _completer = Completer<T>();
 
   _PeekRequest();
 
@@ -728,8 +727,7 @@
       return true;
     }
     if (isDone) {
-      _completer.completeError(
-          new StateError("No elements"), StackTrace.current);
+      _completer.completeError(StateError("No elements"), StackTrace.current);
       return true;
     }
     return false;
@@ -739,7 +737,7 @@
 /// Request for a [StreamQueue.skip] call.
 class _SkipRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by the skip call.
-  final _completer = new Completer<int>();
+  final _completer = Completer<int>();
 
   /// Number of remaining events to skip.
   ///
@@ -776,7 +774,7 @@
 /// Common superclass for [_TakeRequest] and [_LookAheadRequest].
 abstract class _ListRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by the take call.
-  final _completer = new Completer<List<T>>();
+  final _completer = Completer<List<T>>();
 
   /// List collecting events until enough have been seen.
   final _list = <T>[];
@@ -846,7 +844,7 @@
 class _CancelRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by the `cancel` call.
   /// TODO(lrn); make this Completer<void> when that is implemented.
-  final _completer = new Completer();
+  final _completer = Completer();
 
   /// When the event is completed, it needs to cancel the active subscription
   /// of the `StreamQueue` object, if any.
@@ -875,7 +873,7 @@
 /// stream events subscription and creates a stream from it.
 class _RestRequest<T> implements _EventRequest<T> {
   /// Completer for the stream returned by the `rest` call.
-  final _completer = new StreamCompleter<T>();
+  final _completer = StreamCompleter<T>();
 
   /// The [StreamQueue] object that has this request queued.
   ///
@@ -898,7 +896,7 @@
     } else {
       // There are prefetched events which needs to be added before the
       // remaining stream.
-      var controller = new StreamController<T>();
+      var controller = StreamController<T>();
       for (var event in events) {
         event.addTo(controller);
       }
@@ -918,7 +916,7 @@
 /// If the request is closed without seeing an event, then
 /// the [future] is completed with `false`.
 class _HasNextRequest<T> implements _EventRequest<T> {
-  final _completer = new Completer<bool>();
+  final _completer = Completer<bool>();
 
   Future<bool> get future => _completer.future;
 
@@ -947,13 +945,13 @@
   StreamQueueTransaction<T> _transaction;
 
   /// The controller that passes events to [transaction].
-  final _controller = new StreamController<T>(sync: true);
+  final _controller = StreamController<T>(sync: true);
 
   /// The number of events passed to [_controller] so far.
   var _eventsSent = 0;
 
   _TransactionRequest(StreamQueue<T> parent) {
-    _transaction = new StreamQueueTransaction._(parent, _controller.stream);
+    _transaction = StreamQueueTransaction._(parent, _controller.stream);
   }
 
   bool update(QueueList<Result<T>> events, bool isDone) {
diff --git a/lib/src/stream_sink_completer.dart b/lib/src/stream_sink_completer.dart
index 4219126..c7fdd03 100644
--- a/lib/src/stream_sink_completer.dart
+++ b/lib/src/stream_sink_completer.dart
@@ -24,7 +24,7 @@
   ///
   /// Events can be added to the sink either before or after a destination sink
   /// is set.
-  final StreamSink<T> sink = new _CompleterSink<T>();
+  final StreamSink<T> sink = _CompleterSink<T>();
 
   /// Returns [sink] typed as a [_CompleterSink].
   _CompleterSink<T> get _sink => sink;
@@ -37,7 +37,7 @@
   /// If the future completes with an error, the returned sink will instead
   /// be closed. Its [Sink.done] future will contain the error.
   static StreamSink<T> fromFuture<T>(Future<StreamSink<T>> sinkFuture) {
-    var completer = new StreamSinkCompleter<T>();
+    var completer = StreamSinkCompleter<T>();
     sinkFuture.then(completer.setDestinationSink, onError: completer.setError);
     return completer.sink;
   }
@@ -59,7 +59,7 @@
   /// Trying to call either of them again will fail.
   void setDestinationSink(StreamSink<T> destinationSink) {
     if (_sink._destinationSink != null) {
-      throw new StateError("Destination sink already set");
+      throw StateError("Destination sink already set");
     }
     _sink._setDestinationSink(destinationSink);
   }
@@ -71,7 +71,7 @@
   /// Either of [setDestinationSink] or [setError] may be called at most once.
   /// Trying to call either of them again will fail.
   void setError(error, [StackTrace stackTrace]) {
-    setDestinationSink(new NullStreamSink.error(error, stackTrace));
+    setDestinationSink(NullStreamSink.error(error, stackTrace));
   }
 }
 
@@ -101,7 +101,7 @@
   Future get done {
     if (_doneCompleter != null) return _doneCompleter.future;
     if (_destinationSink == null) {
-      _doneCompleter = new Completer.sync();
+      _doneCompleter = Completer.sync();
       return _doneCompleter.future;
     }
     return _destinationSink.done;
@@ -144,7 +144,7 @@
 
   /// Create [_controller] if it doesn't yet exist.
   void _ensureController() {
-    if (_controller == null) _controller = new StreamController(sync: true);
+    if (_controller == null) _controller = StreamController(sync: true);
   }
 
   /// Sets the destination sink to which events from this sink will be provided.
diff --git a/lib/src/stream_sink_transformer.dart b/lib/src/stream_sink_transformer.dart
index 503d28a..b01132e 100644
--- a/lib/src/stream_sink_transformer.dart
+++ b/lib/src/stream_sink_transformer.dart
@@ -37,7 +37,7 @@
       {void handleData(S data, EventSink<T> sink),
       void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
       void handleDone(EventSink<T> sink)}) {
-    return new HandlerTransformer<S, T>(handleData, handleError, handleDone);
+    return HandlerTransformer<S, T>(handleData, handleError, handleDone);
   }
 
   /// Transforms the events passed to [sink].
@@ -57,5 +57,5 @@
           StreamSinkTransformer transformer) =>
       transformer is StreamSinkTransformer<S, T>
           ? transformer
-          : new TypeSafeStreamSinkTransformer(transformer);
+          : TypeSafeStreamSinkTransformer(transformer);
 }
diff --git a/lib/src/stream_sink_transformer/handler_transformer.dart b/lib/src/stream_sink_transformer/handler_transformer.dart
index dba8240..3137003 100644
--- a/lib/src/stream_sink_transformer/handler_transformer.dart
+++ b/lib/src/stream_sink_transformer/handler_transformer.dart
@@ -8,14 +8,14 @@
 import '../delegate/stream_sink.dart';
 
 /// The type of the callback for handling data events.
-typedef void HandleData<S, T>(S data, EventSink<T> sink);
+typedef HandleData<S, T> = void Function(S data, EventSink<T> sink);
 
 /// The type of the callback for handling error events.
-typedef void HandleError<T>(
+typedef HandleError<T> = void Function(
     Object error, StackTrace stackTrace, EventSink<T> sink);
 
 /// The type of the callback for handling done events.
-typedef void HandleDone<T>(EventSink<T> sink);
+typedef HandleDone<T> = void Function(EventSink<T> sink);
 
 /// A [StreamSinkTransformer] that delegates events to the given handlers.
 class HandlerTransformer<S, T> implements StreamSinkTransformer<S, T> {
@@ -30,7 +30,7 @@
 
   HandlerTransformer(this._handleData, this._handleError, this._handleDone);
 
-  StreamSink<S> bind(StreamSink<T> sink) => new _HandlerSink<S, T>(this, sink);
+  StreamSink<S> bind(StreamSink<T> sink) => _HandlerSink<S, T>(this, sink);
 }
 
 /// A sink created by [HandlerTransformer].
@@ -49,7 +49,7 @@
 
   _HandlerSink(this._transformer, StreamSink<T> inner)
       : _inner = inner,
-        _safeCloseInner = new _SafeCloseSink<T>(inner);
+        _safeCloseInner = _SafeCloseSink<T>(inner);
 
   void add(S event) {
     if (_transformer._handleData == null) {
@@ -69,7 +69,7 @@
 
   Future addStream(Stream<S> stream) {
     return _inner.addStream(stream.transform(
-        new StreamTransformer<S, T>.fromHandlers(
+        StreamTransformer<S, T>.fromHandlers(
             handleData: _transformer._handleData,
             handleError: _transformer._handleError,
             handleDone: _closeSink)));
diff --git a/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart b/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
index 32ac648..1010f9f 100644
--- a/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
+++ b/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
@@ -14,7 +14,7 @@
   const StreamTransformerWrapper(this._transformer);
 
   StreamSink<S> bind(StreamSink<T> sink) =>
-      new _StreamTransformerWrapperSink<S, T>(_transformer, sink);
+      _StreamTransformerWrapperSink<S, T>(_transformer, sink);
 }
 
 /// A sink created by [StreamTransformerWrapper].
@@ -23,7 +23,7 @@
   ///
   /// This is used to create a stream that can be transformed by the wrapped
   /// transformer.
-  final _controller = new StreamController<S>(sync: true);
+  final _controller = StreamController<S>(sync: true);
 
   /// The original sink that's being transformed.
   final StreamSink<T> _inner;
diff --git a/lib/src/stream_splitter.dart b/lib/src/stream_splitter.dart
index 3616501..9ddb63a 100644
--- a/lib/src/stream_splitter.dart
+++ b/lib/src/stream_splitter.dart
@@ -32,20 +32,20 @@
 
   /// The buffer of events or errors that have already been emitted by
   /// [_stream].
-  final _buffer = new List<Result<T>>();
+  final _buffer = List<Result<T>>();
 
   /// The controllers for branches that are listening for future events from
   /// [_stream].
   ///
   /// Once a branch is canceled, it's removed from this list. When [_stream] is
   /// done, all branches are removed.
-  final _controllers = new Set<StreamController<T>>();
+  final _controllers = Set<StreamController<T>>();
 
   /// A group of futures returned by [close].
   ///
   /// This is used to ensure that [close] doesn't complete until all
   /// [StreamController.close] and [StreamSubscription.cancel] calls complete.
-  final _closeGroup = new FutureGroup();
+  final _closeGroup = FutureGroup();
 
   /// Whether [_stream] is done emitting events.
   var _isDone = false;
@@ -59,8 +59,8 @@
   /// then closing the [StreamSplitter].
   static List<Stream<T>> splitFrom<T>(Stream<T> stream, [int count]) {
     if (count == null) count = 2;
-    var splitter = new StreamSplitter<T>(stream);
-    var streams = new List<Stream<T>>.generate(count, (_) => splitter.split());
+    var splitter = StreamSplitter<T>(stream);
+    var streams = List<Stream<T>>.generate(count, (_) => splitter.split());
     splitter.close();
     return streams;
   }
@@ -72,10 +72,10 @@
   /// This will throw a [StateError] if [close] has been called.
   Stream<T> split() {
     if (_isClosed) {
-      throw new StateError("Can't call split() on a closed StreamSplitter.");
+      throw StateError("Can't call split() on a closed StreamSplitter.");
     }
 
-    var controller = new StreamController<T>(
+    var controller = StreamController<T>(
         onListen: _onListen, onPause: _onPause, onResume: _onResume);
     controller.onCancel = () => _onCancel(controller);
 
@@ -183,7 +183,7 @@
 
   /// Buffers [data] and passes it to [_controllers].
   void _onData(T data) {
-    if (!_isClosed) _buffer.add(new Result.value(data));
+    if (!_isClosed) _buffer.add(Result.value(data));
     for (var controller in _controllers) {
       controller.add(data);
     }
@@ -191,7 +191,7 @@
 
   /// Buffers [error] and passes it to [_controllers].
   void _onError(Object error, StackTrace stackTrace) {
-    if (!_isClosed) _buffer.add(new Result.error(error, stackTrace));
+    if (!_isClosed) _buffer.add(Result.error(error, stackTrace));
     for (var controller in _controllers) {
       controller.addError(error, stackTrace);
     }
diff --git a/lib/src/stream_subscription_transformer.dart b/lib/src/stream_subscription_transformer.dart
index 1443b18..bee96a5 100644
--- a/lib/src/stream_subscription_transformer.dart
+++ b/lib/src/stream_subscription_transformer.dart
@@ -6,9 +6,9 @@
 
 import 'async_memoizer.dart';
 
-typedef Future _AsyncHandler<T>(StreamSubscription<T> inner);
+typedef _AsyncHandler<T> = Future Function(StreamSubscription<T> inner);
 
-typedef void _VoidHandler<T>(StreamSubscription<T> inner);
+typedef _VoidHandler<T> = void Function(StreamSubscription<T> inner);
 
 /// Creates a [StreamTransformer] that modifies the behavior of subscriptions to
 /// a stream.
@@ -31,8 +31,8 @@
     {Future handleCancel(StreamSubscription<T> inner),
     void handlePause(StreamSubscription<T> inner),
     void handleResume(StreamSubscription<T> inner)}) {
-  return new StreamTransformer((stream, cancelOnError) {
-    return new _TransformedSubscription(
+  return StreamTransformer((stream, cancelOnError) {
+    return _TransformedSubscription(
         stream.listen(null, cancelOnError: cancelOnError),
         handleCancel ?? (inner) => inner.cancel(),
         handlePause ??
@@ -88,7 +88,7 @@
         _inner = null;
         return _handleCancel(inner);
       });
-  final _cancelMemoizer = new AsyncMemoizer();
+  final _cancelMemoizer = AsyncMemoizer();
 
   void pause([Future resumeFuture]) {
     if (_cancelMemoizer.hasRun) return;
@@ -102,5 +102,5 @@
   }
 
   Future<E> asFuture<E>([E futureValue]) =>
-      _inner?.asFuture(futureValue) ?? new Completer<E>().future;
+      _inner?.asFuture(futureValue) ?? Completer<E>().future;
 }
diff --git a/lib/src/stream_zip.dart b/lib/src/stream_zip.dart
index 3d5a811..ef14c3e 100644
--- a/lib/src/stream_zip.dart
+++ b/lib/src/stream_zip.dart
@@ -31,7 +31,7 @@
       dataCount++;
       if (dataCount == subscriptions.length) {
         var data = current;
-        current = new List(subscriptions.length);
+        current = List(subscriptions.length);
         dataCount = 0;
         for (int i = 0; i < subscriptions.length; i++) {
           if (i != index) subscriptions[i].resume();
@@ -84,9 +84,9 @@
       rethrow;
     }
 
-    current = new List(subscriptions.length);
+    current = List(subscriptions.length);
 
-    controller = new StreamController<List<T>>(onPause: () {
+    controller = StreamController<List<T>>(onPause: () {
       for (int i = 0; i < subscriptions.length; i++) {
         // This may pause some subscriptions more than once.
         // These will not be resumed by onResume below, but must wait for the
diff --git a/lib/src/subscription_stream.dart b/lib/src/subscription_stream.dart
index a235663..347c346 100644
--- a/lib/src/subscription_stream.dart
+++ b/lib/src/subscription_stream.dart
@@ -41,14 +41,14 @@
   StreamSubscription<T> listen(void onData(T event),
       {Function onError, void onDone(), bool cancelOnError}) {
     if (_source == null) {
-      throw new StateError("Stream has already been listened to.");
+      throw StateError("Stream has already been listened to.");
     }
     cancelOnError = (true == cancelOnError);
     var subscription = _source;
     _source = null;
 
     var result = cancelOnError
-        ? new _CancelOnErrorSubscriptionWrapper<T>(subscription)
+        ? _CancelOnErrorSubscriptionWrapper<T>(subscription)
         : subscription;
     result.onData(onData);
     result.onError(onError);
diff --git a/lib/src/typed_stream_transformer.dart b/lib/src/typed_stream_transformer.dart
index cb63311..9750eb4 100644
--- a/lib/src/typed_stream_transformer.dart
+++ b/lib/src/typed_stream_transformer.dart
@@ -16,7 +16,7 @@
         StreamTransformer transformer) =>
     transformer is StreamTransformer<S, T>
         ? transformer
-        : new _TypeSafeStreamTransformer(transformer);
+        : _TypeSafeStreamTransformer(transformer);
 
 /// A wrapper that coerces the type of the stream returned by an inner
 /// transformer.
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 2aab40e..39e5a8a 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 
 /// A generic typedef for a function that takes one type and returns another.
-typedef F UnaryFunction<E, F>(E argument);
+typedef UnaryFunction<E, F> = F Function(E argument);
 
 /// A typedef for a function that takes no arguments and returns a Future or a
 /// value.
-typedef FutureOr<T> FutureOrCallback<T>();
+typedef FutureOrCallback<T> = FutureOr<T> Function();
diff --git a/pubspec.yaml b/pubspec.yaml
index 37db660..0b79178 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -6,7 +6,7 @@
 homepage: https://www.github.com/dart-lang/async
 
 environment:
-  sdk: '>=2.0.0-dev.23.0 <3.0.0'
+  sdk: '>=2.0.0 <3.0.0'
 
 dependencies:
   collection: ^1.5.0
diff --git a/test/async_cache_test.dart b/test/async_cache_test.dart
index a4f452f..92e34bf 100644
--- a/test/async_cache_test.dart
+++ b/test/async_cache_test.dart
@@ -13,7 +13,7 @@
 
   setUp(() {
     // Create a cache that is fresh for an hour.
-    cache = new AsyncCache(const Duration(hours: 1));
+    cache = AsyncCache(const Duration(hours: 1));
   });
 
   test('should fetch via a callback when no cache exists', () async {
@@ -27,16 +27,16 @@
 
   test('should not fetch via callback when a future is in-flight', () async {
     // No actual caching is done, just avoid duplicate requests.
-    cache = new AsyncCache.ephemeral();
+    cache = AsyncCache.ephemeral();
 
-    var completer = new Completer<String>();
+    var completer = Completer<String>();
     expect(cache.fetch(() => completer.future), completion('Expensive'));
     expect(cache.fetch(expectAsync0(() {}, count: 0)), completion('Expensive'));
     completer.complete('Expensive');
   });
 
   test('should fetch via a callback again when cache expires', () {
-    new FakeAsync().run((fakeAsync) async {
+    FakeAsync().run((fakeAsync) async {
       var timesCalled = 0;
       call() async => 'Called ${++timesCalled}';
       expect(await cache.fetch(call), 'Called 1');
@@ -67,7 +67,7 @@
   test('should fetch a stream via a callback', () async {
     expect(
         await cache.fetchStream(expectAsync0(() {
-          return new Stream.fromIterable(['1', '2', '3']);
+          return Stream.fromIterable(['1', '2', '3']);
         })).toList(),
         ['1', '2', '3']);
   });
@@ -86,22 +86,22 @@
     // Unlike the above test, we want to verify that we don't make multiple
     // calls if a cache is being filled currently, and instead wait for that
     // cache to be completed.
-    var controller = new StreamController<String>();
+    var controller = StreamController<String>();
     Stream<String> call() => controller.stream;
     expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
     controller.add('1');
     controller.add('2');
-    await new Future.value();
+    await Future.value();
     expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
     controller.add('3');
     await controller.close();
   });
 
   test('should fetch stream via a callback again when cache expires', () {
-    new FakeAsync().run((fakeAsync) async {
+    FakeAsync().run((fakeAsync) async {
       var timesCalled = 0;
       Stream<String> call() {
-        return new Stream.fromIterable(['Called ${++timesCalled}']);
+        return Stream.fromIterable(['Called ${++timesCalled}']);
       }
 
       expect(await cache.fetchStream(call).toList(), ['Called 1']);
@@ -125,7 +125,7 @@
   test('should fetch via a callback when manually invalidated', () async {
     var timesCalled = 0;
     Stream<String> call() {
-      return new Stream.fromIterable(['Called ${++timesCalled}']);
+      return Stream.fromIterable(['Called ${++timesCalled}']);
     }
 
     expect(await cache.fetchStream(call).toList(), ['Called 1']);
@@ -136,7 +136,7 @@
   });
 
   test('should cancel a cached stream without affecting others', () async {
-    Stream<String> call() => new Stream.fromIterable(['1', '2', '3']);
+    Stream<String> call() => Stream.fromIterable(['1', '2', '3']);
 
     expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
 
@@ -145,7 +145,7 @@
   });
 
   test('should pause a cached stream without affecting others', () async {
-    Stream<String> call() => new Stream.fromIterable(['1', '2', '3']);
+    Stream<String> call() => Stream.fromIterable(['1', '2', '3']);
 
     StreamSubscription sub;
     sub = cache.fetchStream(call).listen(expectAsync1((event) {
diff --git a/test/async_memoizer_test.dart b/test/async_memoizer_test.dart
index 380f58d..785f9a5 100644
--- a/test/async_memoizer_test.dart
+++ b/test/async_memoizer_test.dart
@@ -7,7 +7,7 @@
 
 main() {
   AsyncMemoizer cache;
-  setUp(() => cache = new AsyncMemoizer());
+  setUp(() => cache = AsyncMemoizer());
 
   test("runs the function only the first time runOnce() is called", () async {
     var count = 0;
diff --git a/test/byte_collection_test.dart b/test/byte_collection_test.dart
index b87b074..24d218b 100644
--- a/test/byte_collection_test.dart
+++ b/test/byte_collection_test.dart
@@ -10,7 +10,7 @@
 void main() {
   group("collectBytes", () {
     test("simple list and overflow", () {
-      var result = collectBytes(new Stream.fromIterable([
+      var result = collectBytes(Stream.fromIterable([
         [0],
         [1],
         [2],
@@ -20,25 +20,25 @@
     });
 
     test("no events", () {
-      var result = collectBytes(new Stream.fromIterable([]));
+      var result = collectBytes(Stream.fromIterable([]));
       expect(result, completion([]));
     });
 
     test("empty events", () {
-      var result = collectBytes(new Stream.fromIterable([[], []]));
+      var result = collectBytes(Stream.fromIterable([[], []]));
       expect(result, completion([]));
     });
 
     test("error event", () {
-      var result = collectBytes(new Stream.fromIterable(
-          new Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
+      var result = collectBytes(Stream.fromIterable(
+          Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
       expect(result, throwsA("badness"));
     });
   });
 
   group("collectBytes", () {
     test("simple list and overflow", () {
-      var result = collectBytesCancelable(new Stream.fromIterable([
+      var result = collectBytesCancelable(Stream.fromIterable([
         [0],
         [1],
         [2],
@@ -48,23 +48,23 @@
     });
 
     test("no events", () {
-      var result = collectBytesCancelable(new Stream.fromIterable([]));
+      var result = collectBytesCancelable(Stream.fromIterable([]));
       expect(result.value, completion([]));
     });
 
     test("empty events", () {
-      var result = collectBytesCancelable(new Stream.fromIterable([[], []]));
+      var result = collectBytesCancelable(Stream.fromIterable([[], []]));
       expect(result.value, completion([]));
     });
 
     test("error event", () {
-      var result = collectBytesCancelable(new Stream.fromIterable(
-          new Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
+      var result = collectBytesCancelable(Stream.fromIterable(
+          Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
       expect(result.value, throwsA("badness"));
     });
 
     test("cancelled", () async {
-      var sc = new StreamController<List<int>>();
+      var sc = StreamController<List<int>>();
       var result = collectBytesCancelable(sc.stream);
       // Value never completes.
       result.value.whenComplete(expectAsync0(() {}, count: 0));
@@ -87,4 +87,4 @@
   });
 }
 
-Future nextTimerTick() => new Future(() {});
+Future nextTimerTick() => Future(() {});
diff --git a/test/cancelable_operation_test.dart b/test/cancelable_operation_test.dart
index 8c92e2a..4a23856 100644
--- a/test/cancelable_operation_test.dart
+++ b/test/cancelable_operation_test.dart
@@ -13,8 +13,7 @@
   group("without being canceled", () {
     CancelableCompleter completer;
     setUp(() {
-      completer =
-          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
+      completer = CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
     });
 
     test("sends values to the future", () {
@@ -34,14 +33,14 @@
     test("sends values in a future to the future", () {
       expect(completer.operation.value, completion(equals(1)));
       expect(completer.isCompleted, isFalse);
-      completer.complete(new Future.value(1));
+      completer.complete(Future.value(1));
       expect(completer.isCompleted, isTrue);
     });
 
     test("sends errors in a future to the future", () {
       expect(completer.operation.value, throwsA("error"));
       expect(completer.isCompleted, isFalse);
-      completer.complete(new Future.error("error"));
+      completer.complete(Future.error("error"));
       expect(completer.isCompleted, isTrue);
     });
 
@@ -74,31 +73,28 @@
 
       test("successfully then with a future", () {
         completer.complete(1);
-        expect(
-            () => completer.complete(new Completer().future), throwsStateError);
+        expect(() => completer.complete(Completer().future), throwsStateError);
       });
 
       test("with a future then successfully", () {
-        completer.complete(new Completer().future);
+        completer.complete(Completer().future);
         expect(() => completer.complete(1), throwsStateError);
       });
 
       test("with a future twice", () {
-        completer.complete(new Completer().future);
-        expect(
-            () => completer.complete(new Completer().future), throwsStateError);
+        completer.complete(Completer().future);
+        expect(() => completer.complete(Completer().future), throwsStateError);
       });
     });
 
     group("CancelableOperation.fromFuture", () {
       test("forwards values", () {
-        var operation = new CancelableOperation.fromFuture(new Future.value(1));
+        var operation = CancelableOperation.fromFuture(Future.value(1));
         expect(operation.value, completion(equals(1)));
       });
 
       test("forwards errors", () {
-        var operation =
-            new CancelableOperation.fromFuture(new Future.error("error"));
+        var operation = CancelableOperation.fromFuture(Future.error("error"));
         expect(operation.value, throwsA("error"));
       });
     });
@@ -106,7 +102,7 @@
 
   group("when canceled", () {
     test("causes the future never to fire", () async {
-      var completer = new CancelableCompleter();
+      var completer = CancelableCompleter();
       completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       completer.operation.cancel();
 
@@ -119,7 +115,7 @@
     test("fires onCancel", () {
       var canceled = false;
       CancelableCompleter completer;
-      completer = new CancelableCompleter(onCancel: expectAsync0(() {
+      completer = CancelableCompleter(onCancel: expectAsync0(() {
         expect(completer.isCanceled, isTrue);
         canceled = true;
       }));
@@ -134,8 +130,8 @@
     });
 
     test("returns the onCancel future each time cancel is called", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync0(() {
-        return new Future.value(1);
+      var completer = CancelableCompleter(onCancel: expectAsync0(() {
+        return Future.value(1);
       }));
       expect(completer.operation.cancel(), completion(equals(1)));
       expect(completer.operation.cancel(), completion(equals(1)));
@@ -143,13 +139,13 @@
     });
 
     test("returns a future even if onCancel doesn't", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
+      var completer = CancelableCompleter(onCancel: expectAsync0(() {}));
       expect(completer.operation.cancel(), completes);
     });
 
     test("doesn't call onCancel if the completer has completed", () {
       var completer =
-          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
+          CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
       completer.complete(1);
       expect(completer.operation.value, completion(equals(1)));
       expect(completer.operation.cancel(), completes);
@@ -158,8 +154,8 @@
     test(
         "does call onCancel if the completer has completed to an unfired "
         "Future", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
-      completer.complete(new Completer().future);
+      var completer = CancelableCompleter(onCancel: expectAsync0(() {}));
+      completer.complete(Completer().future);
       expect(completer.operation.cancel(), completes);
     });
 
@@ -167,14 +163,14 @@
         "doesn't call onCancel if the completer has completed to a fired "
         "Future", () async {
       var completer =
-          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
-      completer.complete(new Future.value(1));
+          CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
+      completer.complete(Future.value(1));
       await completer.operation.value;
       expect(completer.operation.cancel(), completes);
     });
 
     test("can be completed once after being canceled", () async {
-      var completer = new CancelableCompleter();
+      var completer = CancelableCompleter();
       completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       await completer.operation.cancel();
       completer.complete(1);
@@ -182,13 +178,13 @@
     });
 
     test("fires valueOrCancellation with the given value", () {
-      var completer = new CancelableCompleter();
+      var completer = CancelableCompleter();
       expect(completer.operation.valueOrCancellation(1), completion(equals(1)));
       completer.operation.cancel();
     });
 
     test("pipes an error through valueOrCancellation", () {
-      var completer = new CancelableCompleter(onCancel: () {
+      var completer = CancelableCompleter(onCancel: () {
         throw "error";
       });
       expect(completer.operation.valueOrCancellation(1), throwsA("error"));
@@ -196,9 +192,9 @@
     });
 
     test("valueOrCancellation waits on the onCancel future", () async {
-      var innerCompleter = new Completer();
+      var innerCompleter = Completer();
       var completer =
-          new CancelableCompleter(onCancel: () => innerCompleter.future);
+          CancelableCompleter(onCancel: () => innerCompleter.future);
 
       var fired = false;
       completer.operation.valueOrCancellation().then((_) {
@@ -217,21 +213,21 @@
 
   group("asStream()", () {
     test("emits a value and then closes", () {
-      var completer = new CancelableCompleter();
+      var completer = CancelableCompleter();
       expect(completer.operation.asStream().toList(), completion(equals([1])));
       completer.complete(1);
     });
 
     test("emits an error and then closes", () {
-      var completer = new CancelableCompleter();
-      var queue = new StreamQueue(completer.operation.asStream());
+      var completer = CancelableCompleter();
+      var queue = StreamQueue(completer.operation.asStream());
       expect(queue.next, throwsA("error"));
       expect(queue.hasNext, completion(isFalse));
       completer.completeError("error");
     });
 
     test("cancels the completer when the subscription is canceled", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
+      var completer = CancelableCompleter(onCancel: expectAsync0(() {}));
       var sub =
           completer.operation.asStream().listen(expectAsync1((_) {}, count: 0));
       completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
diff --git a/test/future_group_test.dart b/test/future_group_test.dart
index b6f75ba..770a465 100644
--- a/test/future_group_test.dart
+++ b/test/future_group_test.dart
@@ -12,7 +12,7 @@
 void main() {
   FutureGroup futureGroup;
   setUp(() {
-    futureGroup = new FutureGroup();
+    futureGroup = FutureGroup();
   });
 
   group("with no futures", () {
@@ -32,7 +32,7 @@
 
   group("with a future that already completed", () {
     test("never completes if nothing happens", () async {
-      futureGroup.add(new Future.value());
+      futureGroup.add(Future.value());
       await flushMicrotasks();
 
       var completed = false;
@@ -43,7 +43,7 @@
     });
 
     test("completes once it's closed", () async {
-      futureGroup.add(new Future.value());
+      futureGroup.add(Future.value());
       await flushMicrotasks();
 
       expect(futureGroup.future, completes);
@@ -51,21 +51,21 @@
     });
 
     test("completes to that future's value", () {
-      futureGroup.add(new Future.value(1));
+      futureGroup.add(Future.value(1));
       futureGroup.close();
       expect(futureGroup.future, completion(equals([1])));
     });
 
     test("completes to that future's error, even if it's not closed", () {
-      futureGroup.add(new Future.error("error"));
+      futureGroup.add(Future.error("error"));
       expect(futureGroup.future, throwsA("error"));
     });
   });
 
   test("completes once all contained futures complete", () async {
-    var completer1 = new Completer();
-    var completer2 = new Completer();
-    var completer3 = new Completer();
+    var completer1 = Completer();
+    var completer2 = Completer();
+    var completer3 = Completer();
 
     futureGroup.add(completer1.future);
     futureGroup.add(completer2.future);
@@ -89,9 +89,9 @@
   });
 
   test("completes to the values of the futures in order of addition", () {
-    var completer1 = new Completer();
-    var completer2 = new Completer();
-    var completer3 = new Completer();
+    var completer1 = Completer();
+    var completer2 = Completer();
+    var completer3 = Completer();
 
     futureGroup.add(completer1.future);
     futureGroup.add(completer2.future);
@@ -108,9 +108,9 @@
 
   test("completes to the first error to be emitted, even if it's not closed",
       () {
-    var completer1 = new Completer();
-    var completer2 = new Completer();
-    var completer3 = new Completer();
+    var completer1 = Completer();
+    var completer2 = Completer();
+    var completer3 = Completer();
 
     futureGroup.add(completer1.future);
     futureGroup.add(completer2.future);
@@ -126,9 +126,9 @@
       var idle = false;
       futureGroup.onIdle.listen((_) => idle = true);
 
-      var completer1 = new Completer();
-      var completer2 = new Completer();
-      var completer3 = new Completer();
+      var completer1 = Completer();
+      var completer2 = Completer();
+      var completer3 = Completer();
 
       futureGroup.add(completer1.future);
       futureGroup.add(completer2.future);
@@ -158,7 +158,7 @@
       var idle = false;
       futureGroup.onIdle.listen((_) => idle = true);
 
-      var completer = new Completer();
+      var completer = Completer();
       futureGroup.add(completer.future);
 
       completer.complete();
@@ -167,7 +167,7 @@
       expect(futureGroup.isIdle, isTrue);
 
       idle = false;
-      completer = new Completer();
+      completer = Completer();
       futureGroup.add(completer.future);
 
       await flushMicrotasks();
@@ -202,7 +202,7 @@
         futureFired = true;
       }));
 
-      var completer = new Completer();
+      var completer = Completer();
       futureGroup.add(completer.future);
       futureGroup.close();
 
diff --git a/test/lazy_stream_test.dart b/test/lazy_stream_test.dart
index 0c2e344..db1bc94 100644
--- a/test/lazy_stream_test.dart
+++ b/test/lazy_stream_test.dart
@@ -11,14 +11,14 @@
 
 main() {
   test("disallows a null callback", () {
-    expect(() => new LazyStream(null), throwsArgumentError);
+    expect(() => LazyStream(null), throwsArgumentError);
   });
 
   test("calls the callback when the stream is listened", () async {
     var callbackCalled = false;
-    var stream = new LazyStream(expectAsync0(() {
+    var stream = LazyStream(expectAsync0(() {
       callbackCalled = true;
-      return new Stream.empty();
+      return Stream.empty();
     }));
 
     await flushMicrotasks();
@@ -30,9 +30,9 @@
 
   test("calls the callback when the stream is listened", () async {
     var callbackCalled = false;
-    var stream = new LazyStream(expectAsync0(() {
+    var stream = LazyStream(expectAsync0(() {
       callbackCalled = true;
-      return new Stream.empty();
+      return Stream.empty();
     }));
 
     await flushMicrotasks();
@@ -43,8 +43,8 @@
   });
 
   test("forwards to a synchronously-provided stream", () async {
-    var controller = new StreamController<int>();
-    var stream = new LazyStream(expectAsync0(() => controller.stream));
+    var controller = StreamController<int>();
+    var stream = LazyStream(expectAsync0(() => controller.stream));
 
     var events = [];
     stream.listen(events.add);
@@ -65,8 +65,8 @@
   });
 
   test("forwards to an asynchronously-provided stream", () async {
-    var controller = new StreamController<int>();
-    var stream = new LazyStream(expectAsync0(() async => controller.stream));
+    var controller = StreamController<int>();
+    var stream = LazyStream(expectAsync0(() async => controller.stream));
 
     var events = [];
     stream.listen(events.add);
@@ -87,7 +87,7 @@
   });
 
   test("a lazy stream can't be listened to multiple times", () {
-    var stream = new LazyStream(expectAsync0(() => new Stream.empty()));
+    var stream = LazyStream(expectAsync0(() => Stream.empty()));
     expect(stream.isBroadcast, isFalse);
 
     stream.listen(null);
@@ -97,9 +97,9 @@
 
   test("a lazy stream can't be listened to from within its callback", () {
     LazyStream stream;
-    stream = new LazyStream(expectAsync0(() {
+    stream = LazyStream(expectAsync0(() {
       expect(() => stream.listen(null), throwsStateError);
-      return new Stream.empty();
+      return Stream.empty();
     }));
     stream.listen(null);
   });
diff --git a/test/null_stream_sink_test.dart b/test/null_stream_sink_test.dart
index 244f99c..33e2655 100644
--- a/test/null_stream_sink_test.dart
+++ b/test/null_stream_sink_test.dart
@@ -12,13 +12,13 @@
 void main() {
   group("constructors", () {
     test("done defaults to a completed future", () {
-      var sink = new NullStreamSink();
+      var sink = NullStreamSink();
       expect(sink.done, completes);
     });
 
     test("a custom future may be passed to done", () async {
-      var completer = new Completer();
-      var sink = new NullStreamSink(done: completer.future);
+      var completer = Completer();
+      var sink = NullStreamSink(done: completer.future);
 
       var doneFired = false;
       sink.done.then((_) {
@@ -33,32 +33,32 @@
     });
 
     test("NullStreamSink.error passes an error to done", () {
-      var sink = new NullStreamSink.error("oh no");
+      var sink = NullStreamSink.error("oh no");
       expect(sink.done, throwsA("oh no"));
     });
   });
 
   group("events", () {
     test("are silently dropped before close", () {
-      var sink = new NullStreamSink();
+      var sink = NullStreamSink();
       sink.add(1);
       sink.addError("oh no");
     });
 
     test("throw StateErrors after close", () {
-      var sink = new NullStreamSink();
+      var sink = NullStreamSink();
       expect(sink.close(), completes);
 
       expect(() => sink.add(1), throwsStateError);
       expect(() => sink.addError("oh no"), throwsStateError);
-      expect(() => sink.addStream(new Stream.empty()), throwsStateError);
+      expect(() => sink.addStream(Stream.empty()), throwsStateError);
     });
 
     group("addStream", () {
       test("listens to the stream then cancels immediately", () async {
-        var sink = new NullStreamSink();
+        var sink = NullStreamSink();
         var canceled = false;
-        var controller = new StreamController(onCancel: () {
+        var controller = StreamController(onCancel: () {
           canceled = true;
         });
 
@@ -68,9 +68,9 @@
       });
 
       test("returns the cancel future", () async {
-        var completer = new Completer();
-        var sink = new NullStreamSink();
-        var controller = new StreamController(onCancel: () => completer.future);
+        var completer = Completer();
+        var sink = NullStreamSink();
+        var controller = StreamController(onCancel: () => completer.future);
 
         var addStreamFired = false;
         sink.addStream(controller.stream).then((_) {
@@ -85,29 +85,29 @@
       });
 
       test("pipes errors from the cancel future through addStream", () async {
-        var sink = new NullStreamSink();
-        var controller = new StreamController(onCancel: () => throw "oh no");
+        var sink = NullStreamSink();
+        var controller = StreamController(onCancel: () => throw "oh no");
         expect(sink.addStream(controller.stream), throwsA("oh no"));
       });
 
       test("causes events to throw StateErrors until the future completes",
           () async {
-        var sink = new NullStreamSink();
-        var future = sink.addStream(new Stream.empty());
+        var sink = NullStreamSink();
+        var future = sink.addStream(Stream.empty());
         expect(() => sink.add(1), throwsStateError);
         expect(() => sink.addError("oh no"), throwsStateError);
-        expect(() => sink.addStream(new Stream.empty()), throwsStateError);
+        expect(() => sink.addStream(Stream.empty()), throwsStateError);
 
         await future;
         sink.add(1);
         sink.addError("oh no");
-        expect(sink.addStream(new Stream.empty()), completes);
+        expect(sink.addStream(Stream.empty()), completes);
       });
     });
   });
 
   test("close returns the done future", () {
-    var sink = new NullStreamSink.error("oh no");
+    var sink = NullStreamSink.error("oh no");
     expect(sink.close(), throwsA("oh no"));
   });
 }
diff --git a/test/restartable_timer_test.dart b/test/restartable_timer_test.dart
index 4f59f62..c46c87b 100644
--- a/test/restartable_timer_test.dart
+++ b/test/restartable_timer_test.dart
@@ -8,100 +8,99 @@
 
 main() {
   test("runs the callback once the duration has elapsed", () {
-    new FakeAsync().run((async) {
+    FakeAsync().run((async) {
       var fired = false;
-      new RestartableTimer(new Duration(seconds: 5), () {
+      RestartableTimer(Duration(seconds: 5), () {
         fired = true;
       });
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
 
-      async.elapse(new Duration(seconds: 1));
+      async.elapse(Duration(seconds: 1));
       expect(fired, isTrue);
     });
   });
 
   test("doesn't run the callback if the timer is canceled", () {
-    new FakeAsync().run((async) {
+    FakeAsync().run((async) {
       var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
+      var timer = RestartableTimer(Duration(seconds: 5), () {
         fired = true;
       });
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
       timer.cancel();
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
     });
   });
 
   test("resets the duration if the timer is reset before it fires", () {
-    new FakeAsync().run((async) {
+    FakeAsync().run((async) {
       var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
+      var timer = RestartableTimer(Duration(seconds: 5), () {
         fired = true;
       });
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
       timer.reset();
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
 
-      async.elapse(new Duration(seconds: 1));
+      async.elapse(Duration(seconds: 1));
       expect(fired, isTrue);
     });
   });
 
   test("re-runs the callback if the timer is reset after firing", () {
-    new FakeAsync().run((async) {
+    FakeAsync().run((async) {
       var fired = 0;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
+      var timer = RestartableTimer(Duration(seconds: 5), () {
         fired++;
       });
 
-      async.elapse(new Duration(seconds: 5));
+      async.elapse(Duration(seconds: 5));
       expect(fired, equals(1));
       timer.reset();
 
-      async.elapse(new Duration(seconds: 5));
+      async.elapse(Duration(seconds: 5));
       expect(fired, equals(2));
       timer.reset();
 
-      async.elapse(new Duration(seconds: 5));
+      async.elapse(Duration(seconds: 5));
       expect(fired, equals(3));
     });
   });
 
   test("runs the callback if the timer is reset after being canceled", () {
-    new FakeAsync().run((async) {
+    FakeAsync().run((async) {
       var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
+      var timer = RestartableTimer(Duration(seconds: 5), () {
         fired = true;
       });
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
       timer.cancel();
 
-      async.elapse(new Duration(seconds: 4));
+      async.elapse(Duration(seconds: 4));
       expect(fired, isFalse);
       timer.reset();
 
-      async.elapse(new Duration(seconds: 5));
+      async.elapse(Duration(seconds: 5));
       expect(fired, isTrue);
     });
   });
 
   test("only runs the callback once if the timer isn't reset", () {
-    new FakeAsync().run((async) {
-      new RestartableTimer(
-          new Duration(seconds: 5), expectAsync0(() {}, count: 1));
-      async.elapse(new Duration(seconds: 10));
+    FakeAsync().run((async) {
+      RestartableTimer(Duration(seconds: 5), expectAsync0(() {}, count: 1));
+      async.elapse(Duration(seconds: 10));
     });
   });
 }
diff --git a/test/result/result_captureAll_test.dart b/test/result/result_captureAll_test.dart
index 172e38a..c7b688f 100644
--- a/test/result/result_captureAll_test.dart
+++ b/test/result/result_captureAll_test.dart
@@ -8,16 +8,16 @@
 import "package:test/test.dart";
 
 final someStack = StackTrace.current;
-Result<int> res(int n) => new Result<int>.value(n);
-Result err(n) => new ErrorResult("$n", someStack);
+Result<int> res(int n) => Result<int>.value(n);
+Result err(n) => ErrorResult("$n", someStack);
 
 /// Helper function creating an iterable of futures.
 Iterable<Future<int>> futures(int count, {bool throwWhen(int index)}) sync* {
   for (int i = 0; i < count; i++) {
     if (throwWhen != null && throwWhen(i)) {
-      yield new Future<int>.error("$i", someStack);
+      yield Future<int>.error("$i", someStack);
     } else {
-      yield new Future<int>.value(i);
+      yield Future<int>.value(i);
     }
   }
 }
@@ -58,7 +58,7 @@
     });
 
     test("completion permutation 1-2-3", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
+      var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
@@ -70,7 +70,7 @@
     });
 
     test("completion permutation 1-3-2", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
+      var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
@@ -82,7 +82,7 @@
     });
 
     test("completion permutation 2-1-3", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
+      var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
@@ -94,7 +94,7 @@
     });
 
     test("completion permutation 2-3-1", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
+      var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
@@ -106,7 +106,7 @@
     });
 
     test("completion permutation 3-1-2", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
+      var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
@@ -118,7 +118,7 @@
     });
 
     test("completion permutation 3-2-1", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
+      var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
@@ -129,19 +129,19 @@
       cs[0].complete(1);
     });
 
-    var seed = new Random().nextInt(0x100000000);
+    var seed = Random().nextInt(0x100000000);
     int n = 25; // max 32, otherwise rnd.nextInt(1<<n) won't work.
     test("randomized #$n seed:${seed.toRadixString(16)}", () async {
-      var cs = new List.generate(n, (_) => new Completer<int>());
+      var cs = List.generate(n, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
-      var rnd = new Random(seed);
+      var rnd = Random(seed);
       var throwFlags = rnd.nextInt(1 << n); // Bit-flag for throwing.
       bool throws(index) => (throwFlags & (1 << index)) != 0;
-      var expected = new List.generate(n, (x) => throws(x) ? err(x) : res(x));
+      var expected = List.generate(n, (x) => throws(x) ? err(x) : res(x));
 
       expect(all, completion(expected));
 
-      var completeFunctions = new List<Function()>.generate(n, (i) {
+      var completeFunctions = List<Function()>.generate(n, (i) {
         var c = cs[i];
         return () =>
             throws(i) ? c.completeError("$i", someStack) : c.complete(i);
@@ -167,19 +167,19 @@
     test("no error", () async {
       var all = await Result.captureAll<int>(<FutureOr<int>>[
         1,
-        new Future<int>(() => 2),
+        Future<int>(() => 2),
         3,
-        new Future<int>.value(4),
+        Future<int>.value(4),
       ]);
       expect(all, [res(1), res(2), res(3), res(4)]);
     });
     test("error", () async {
       var all = await Result.captureAll<int>(<FutureOr<int>>[
         1,
-        new Future<int>(() => 2),
+        Future<int>(() => 2),
         3,
-        new Future<int>(() async => await new Future.error("4", someStack)),
-        new Future<int>.value(5)
+        Future<int>(() async => await Future.error("4", someStack)),
+        Future<int>.value(5)
       ]);
       expect(all, [res(1), res(2), res(3), err(4), res(5)]);
     });
diff --git a/test/result/result_flattenAll_test.dart b/test/result/result_flattenAll_test.dart
index caaf668..4a049eb 100644
--- a/test/result/result_flattenAll_test.dart
+++ b/test/result/result_flattenAll_test.dart
@@ -6,8 +6,8 @@
 import "package:test/test.dart";
 
 final someStack = StackTrace.current;
-Result<T> res<T>(T n) => new Result<T>.value(n);
-Result err(n) => new ErrorResult("$n", someStack);
+Result<T> res<T>(T n) => Result<T>.value(n);
+Result err(n) => ErrorResult("$n", someStack);
 
 /// Helper function creating an iterable of results.
 Iterable<Result<int>> results(int count, {bool throwWhen(int index)}) sync* {
diff --git a/test/result/result_future_test.dart b/test/result/result_future_test.dart
index ffdbb7c..4218db2 100644
--- a/test/result/result_future_test.dart
+++ b/test/result/result_future_test.dart
@@ -12,8 +12,8 @@
   Completer completer;
   ResultFuture future;
   setUp(() {
-    completer = new Completer();
-    future = new ResultFuture(completer.future);
+    completer = Completer();
+    future = ResultFuture(completer.future);
   });
 
   test('before completion, result is null', () {
@@ -30,7 +30,7 @@
   });
 
   test("after an error completion, result is the future's error", () {
-    var trace = new Trace.current();
+    var trace = Trace.current();
     completer.completeError('error', trace);
 
     // The completer calls its listeners asynchronously. We have to wait
diff --git a/test/result/result_test.dart b/test/result/result_test.dart
index 33e146e..a33c1ba 100644
--- a/test/result/result_test.dart
+++ b/test/result/result_test.dart
@@ -10,10 +10,10 @@
 import "package:test/test.dart";
 
 void main() {
-  var stack = new Trace.current();
+  var stack = Trace.current();
 
   test("create result value", () {
-    Result<int> result = new Result<int>.value(42);
+    Result<int> result = Result<int>.value(42);
     expect(result.isValue, isTrue);
     expect(result.isError, isFalse);
     ValueResult value = result.asValue;
@@ -21,7 +21,7 @@
   });
 
   test("create result value 2", () {
-    Result<int> result = new ValueResult<int>(42);
+    Result<int> result = ValueResult<int>(42);
     expect(result.isValue, isTrue);
     expect(result.isError, isFalse);
     ValueResult<int> value = result.asValue;
@@ -29,7 +29,7 @@
   });
 
   test("create result error", () {
-    Result<bool> result = new Result<bool>.error("BAD", stack);
+    Result<bool> result = Result<bool>.error("BAD", stack);
     expect(result.isValue, isFalse);
     expect(result.isError, isTrue);
     ErrorResult error = result.asError;
@@ -38,7 +38,7 @@
   });
 
   test("create result error 2", () {
-    Result<bool> result = new ErrorResult("BAD", stack);
+    Result<bool> result = ErrorResult("BAD", stack);
     expect(result.isValue, isFalse);
     expect(result.isError, isTrue);
     ErrorResult error = result.asError;
@@ -47,7 +47,7 @@
   });
 
   test("create result error no stack", () {
-    Result<bool> result = new Result<bool>.error("BAD");
+    Result<bool> result = Result<bool>.error("BAD");
     expect(result.isValue, isFalse);
     expect(result.isError, isTrue);
     ErrorResult error = result.asError;
@@ -56,8 +56,8 @@
   });
 
   test("complete with value", () {
-    Result<int> result = new ValueResult<int>(42);
-    var c = new Completer<int>();
+    Result<int> result = ValueResult<int>(42);
+    var c = Completer<int>();
     c.future.then(expectAsync1((int v) {
       expect(v, equals(42));
     }), onError: (e, s) {
@@ -67,8 +67,8 @@
   });
 
   test("complete with error", () {
-    Result<bool> result = new ErrorResult("BAD", stack);
-    var c = new Completer<bool>();
+    Result<bool> result = ErrorResult("BAD", stack);
+    var c = Completer<bool>();
     c.future.then((bool v) {
       fail("Unexpected value $v");
     }, onError: expectAsync2((e, s) {
@@ -79,16 +79,16 @@
   });
 
   test("add sink value", () {
-    var result = new ValueResult<int>(42);
-    EventSink<int> sink = new TestSink(onData: expectAsync1((v) {
+    var result = ValueResult<int>(42);
+    EventSink<int> sink = TestSink(onData: expectAsync1((v) {
       expect(v, equals(42));
     }));
     result.addTo(sink);
   });
 
   test("add sink error", () {
-    Result<bool> result = new ErrorResult("BAD", stack);
-    EventSink<bool> sink = new TestSink(onError: expectAsync2((e, s) {
+    Result<bool> result = ErrorResult("BAD", stack);
+    EventSink<bool> sink = TestSink(onError: expectAsync2((e, s) {
       expect(e, equals("BAD"));
       expect(s, same(stack));
     }));
@@ -96,7 +96,7 @@
   });
 
   test("value as future", () {
-    Result<int> result = new ValueResult<int>(42);
+    Result<int> result = ValueResult<int>(42);
     result.asFuture.then(expectAsync1((int v) {
       expect(v, equals(42));
     }), onError: (e, s) {
@@ -105,7 +105,7 @@
   });
 
   test("error as future", () {
-    Result<bool> result = new ErrorResult("BAD", stack);
+    Result<bool> result = ErrorResult("BAD", stack);
     result.asFuture.then((bool v) {
       fail("Unexpected value $v");
     }, onError: expectAsync2((e, s) {
@@ -115,7 +115,7 @@
   });
 
   test("capture future value", () {
-    Future<int> value = new Future<int>.value(42);
+    Future<int> value = Future<int>.value(42);
     Result.capture(value).then(expectAsync1((Result result) {
       expect(result.isValue, isTrue);
       expect(result.isError, isFalse);
@@ -127,7 +127,7 @@
   });
 
   test("capture future error", () {
-    Future<bool> value = new Future<bool>.error("BAD", stack);
+    Future<bool> value = Future<bool>.error("BAD", stack);
     Result.capture(value).then(expectAsync1((Result result) {
       expect(result.isValue, isFalse);
       expect(result.isError, isTrue);
@@ -141,7 +141,7 @@
 
   test("release future value", () {
     Future<Result<int>> future =
-        new Future<Result<int>>.value(new Result<int>.value(42));
+        Future<Result<int>>.value(Result<int>.value(42));
     Result.release(future).then(expectAsync1((v) {
       expect(v, equals(42));
     }), onError: (e, s) {
@@ -152,7 +152,7 @@
   test("release future error", () {
     // An error in the result is unwrapped and reified by release.
     Future<Result<bool>> future =
-        new Future<Result<bool>>.value(new Result<bool>.error("BAD", stack));
+        Future<Result<bool>>.value(Result<bool>.error("BAD", stack));
     Result.release(future).then((v) {
       fail("Unexpected value: $v");
     }, onError: expectAsync2((e, s) {
@@ -163,7 +163,7 @@
 
   test("release future real error", () {
     // An error in the error lane is passed through by release.
-    Future<Result<bool>> future = new Future<Result<bool>>.error("BAD", stack);
+    Future<Result<bool>> future = Future<Result<bool>>.error("BAD", stack);
     Result.release(future).then((v) {
       fail("Unexpected value: $v");
     }, onError: expectAsync2((e, s) {
@@ -173,13 +173,10 @@
   });
 
   test("capture stream", () {
-    var c = new StreamController<int>();
+    var c = StreamController<int>();
     var stream = Result.captureStream(c.stream);
-    var expectedList = new Queue.from([
-      new Result.value(42),
-      new Result.error("BAD", stack),
-      new Result.value(37)
-    ]);
+    var expectedList = Queue.from(
+        [Result.value(42), Result.error("BAD", stack), Result.value(37)]);
     void listener(Result actual) {
       expect(expectedList.isEmpty, isFalse);
       expectResult(actual, expectedList.removeFirst());
@@ -194,16 +191,15 @@
   });
 
   test("release stream", () {
-    StreamController<Result<int>> c = new StreamController<Result<int>>();
+    StreamController<Result<int>> c = StreamController<Result<int>>();
     Stream<int> stream = Result.releaseStream(c.stream);
     var events = [
-      new Result<int>.value(42),
-      new Result<int>.error("BAD", stack),
-      new Result<int>.value(37)
+      Result<int>.value(42),
+      Result<int>.error("BAD", stack),
+      Result<int>.value(37)
     ];
     // Expect the data events, and an extra error event.
-    var expectedList = new Queue.from(events)
-      ..add(new Result.error("BAD2", stack));
+    var expectedList = Queue.from(events)..add(Result.error("BAD2", stack));
 
     void dataListener(int v) {
       expect(expectedList.isEmpty, isFalse);
@@ -231,7 +227,7 @@
   });
 
   test("release stream cancel on error", () {
-    StreamController<Result<int>> c = new StreamController<Result<int>>();
+    StreamController<Result<int>> c = StreamController<Result<int>>();
     Stream<int> stream = Result.releaseStream(c.stream);
     stream.listen(expectAsync1((v) {
       expect(v, equals(42));
@@ -241,34 +237,34 @@
     }), onDone: () {
       fail("Unexpected done event");
     }, cancelOnError: true);
-    c.add(new Result.value(42));
-    c.add(new Result.error("BAD", stack));
-    c.add(new Result.value(37));
+    c.add(Result.value(42));
+    c.add(Result.error("BAD", stack));
+    c.add(Result.value(37));
     c.close();
   });
 
   test("flatten error 1", () {
-    Result<int> error = new Result<int>.error("BAD", stack);
+    Result<int> error = Result<int>.error("BAD", stack);
     Result<int> flattened =
-        Result.flatten(new Result<Result<int>>.error("BAD", stack));
+        Result.flatten(Result<Result<int>>.error("BAD", stack));
     expectResult(flattened, error);
   });
 
   test("flatten error 2", () {
-    Result<int> error = new Result<int>.error("BAD", stack);
-    Result<Result<int>> result = new Result<Result<int>>.value(error);
+    Result<int> error = Result<int>.error("BAD", stack);
+    Result<Result<int>> result = Result<Result<int>>.value(error);
     Result<int> flattened = Result.flatten(result);
     expectResult(flattened, error);
   });
 
   test("flatten value", () {
     Result<Result<int>> result =
-        new Result<Result<int>>.value(new Result<int>.value(42));
-    expectResult(Result.flatten(result), new Result<int>.value(42));
+        Result<Result<int>>.value(Result<int>.value(42));
+    expectResult(Result.flatten(result), Result<int>.value(42));
   });
 
   test("handle unary", () {
-    ErrorResult result = new Result.error("error", stack);
+    ErrorResult result = Result.error("error", stack);
     bool called = false;
     result.handle((error) {
       called = true;
@@ -278,7 +274,7 @@
   });
 
   test("handle binary", () {
-    ErrorResult result = new Result.error("error", stack);
+    ErrorResult result = Result.error("error", stack);
     bool called = false;
     result.handle((error, stackTrace) {
       called = true;
@@ -289,7 +285,7 @@
   });
 
   test("handle unary and binary", () {
-    ErrorResult result = new Result.error("error", stack);
+    ErrorResult result = Result.error("error", stack);
     bool called = false;
     result.handle((error, [stackTrace]) {
       called = true;
@@ -300,7 +296,7 @@
   });
 
   test("handle neither unary nor binary", () {
-    ErrorResult result = new Result.error("error", stack);
+    ErrorResult result = Result.error("error", stack);
     expect(() => result.handle(() => fail("unreachable")), throwsA(anything));
     expect(() => result.handle((a, b, c) => fail("unreachable")),
         throwsA(anything));
@@ -332,9 +328,9 @@
   final Function onDone;
 
   TestSink(
-      {void this.onData(T data): _nullData,
-      void this.onError(e, StackTrace s): _nullError,
-      void this.onDone(): _nullDone});
+      {void this.onData(T data) = _nullData,
+      void this.onError(e, StackTrace s) = _nullError,
+      void this.onDone() = _nullDone});
 
   void add(T value) {
     onData(value);
diff --git a/test/single_subscription_transformer_test.dart b/test/single_subscription_transformer_test.dart
index 74e462b..95b321b 100644
--- a/test/single_subscription_transformer_test.dart
+++ b/test/single_subscription_transformer_test.dart
@@ -11,7 +11,7 @@
 
 void main() {
   test("buffers events as soon as it's bound", () async {
-    var controller = new StreamController.broadcast();
+    var controller = StreamController.broadcast();
     var stream =
         controller.stream.transform(const SingleSubscriptionTransformer());
 
@@ -31,7 +31,7 @@
   test("cancels the subscription to the broadcast stream when it's canceled",
       () async {
     var canceled = false;
-    var controller = new StreamController.broadcast(onCancel: () {
+    var controller = StreamController.broadcast(onCancel: () {
       canceled = true;
     });
     var stream =
diff --git a/test/stream_completer_test.dart b/test/stream_completer_test.dart
index 55b4ce3..fb1f4a5 100644
--- a/test/stream_completer_test.dart
+++ b/test/stream_completer_test.dart
@@ -11,13 +11,13 @@
 
 main() {
   test("a stream is linked before listening", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     completer.setSourceStream(createStream());
     expect(completer.stream.toList(), completion([1, 2, 3, 4]));
   });
 
   test("listened to before a stream is linked", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     var done = completer.stream.toList();
     await flushMicrotasks();
     completer.setSourceStream(createStream());
@@ -25,20 +25,20 @@
   });
 
   test("cancel before linking a stream doesn't listen on stream", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     var subscription = completer.stream.listen(null);
     subscription.pause(); // Should be ignored.
     subscription.cancel();
-    completer.setSourceStream(new UnusableStream()); // Doesn't throw.
+    completer.setSourceStream(UnusableStream()); // Doesn't throw.
   });
 
   test("listen and pause before linking stream", () async {
-    var controller = new StreamCompleter();
+    var controller = StreamCompleter();
     var events = [];
     var subscription = controller.stream.listen(events.add);
     var done = subscription.asFuture();
     subscription.pause();
-    var sourceController = new StreamController();
+    var sourceController = StreamController();
     sourceController..add(1)..add(2)..add(3)..add(4);
     controller.setSourceStream(sourceController.stream);
     await flushMicrotasks();
@@ -56,7 +56,7 @@
   });
 
   test("pause more than once", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     var events = [];
     var subscription = completer.stream.listen(events.add);
     var done = subscription.asFuture();
@@ -74,9 +74,9 @@
   });
 
   test("cancel new stream before source is done", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     var lastEvent = -1;
-    var controller = new StreamController();
+    var controller = StreamController();
     StreamSubscription subscription;
     subscription = completer.stream.listen((value) {
       expect(value, lessThan(3));
@@ -106,17 +106,17 @@
   });
 
   test("complete with setEmpty before listening", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     completer.setEmpty();
-    var done = new Completer();
+    var done = Completer();
     completer.stream.listen(unreachable("data"),
         onError: unreachable("error"), onDone: done.complete);
     await done.future;
   });
 
   test("complete with setEmpty after listening", () async {
-    var completer = new StreamCompleter();
-    var done = new Completer();
+    var completer = StreamCompleter();
+    var done = Completer();
     completer.stream.listen(unreachable("data"),
         onError: unreachable("error"), onDone: done.complete);
     completer.setEmpty();
@@ -124,9 +124,9 @@
   });
 
   test("source stream isn't listened to until completer stream is", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     StreamController controller;
-    controller = new StreamController(onListen: () {
+    controller = StreamController(onListen: () {
       scheduleMicrotask(controller.close);
     });
 
@@ -139,9 +139,9 @@
   });
 
   test("cancelOnError true when listening before linking stream", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     Object lastEvent = -1;
-    var controller = new StreamController();
+    var controller = StreamController();
     completer.stream.listen((value) {
       expect(value, lessThan(3));
       lastEvent = value;
@@ -172,9 +172,9 @@
   });
 
   test("cancelOnError true when listening after linking stream", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     Object lastEvent = -1;
-    var controller = new StreamController();
+    var controller = StreamController();
     completer.setSourceStream(controller.stream);
     controller.add(1);
     expect(controller.hasListener, isFalse);
@@ -204,7 +204,7 @@
   });
 
   test("linking a stream after setSourceStream before listen", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     completer.setSourceStream(createStream());
     expect(() => completer.setSourceStream(createStream()), throwsStateError);
     expect(() => completer.setEmpty(), throwsStateError);
@@ -215,7 +215,7 @@
   });
 
   test("linking a stream after setSourceStream after listen", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     var list = completer.stream.toList();
     completer.setSourceStream(createStream());
     expect(() => completer.setSourceStream(createStream()), throwsStateError);
@@ -227,7 +227,7 @@
   });
 
   test("linking a stream after setEmpty before listen", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     completer.setEmpty();
     expect(() => completer.setSourceStream(createStream()), throwsStateError);
     expect(() => completer.setEmpty(), throwsStateError);
@@ -238,7 +238,7 @@
   });
 
   test("linking a stream after setEmpty() after listen", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     var list = completer.stream.toList();
     completer.setEmpty();
     expect(() => completer.setSourceStream(createStream()), throwsStateError);
@@ -250,7 +250,7 @@
   });
 
   test("listening more than once after setting stream", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     completer.setSourceStream(createStream());
     var list = completer.stream.toList();
     expect(() => completer.stream.toList(), throwsStateError);
@@ -259,14 +259,14 @@
   });
 
   test("listening more than once before setting stream", () async {
-    var completer = new StreamCompleter();
+    var completer = StreamCompleter();
     completer.stream.toList();
     expect(() => completer.stream.toList(), throwsStateError);
   });
 
   test("setting onData etc. before and after setting stream", () async {
-    var completer = new StreamCompleter();
-    var controller = new StreamController();
+    var completer = StreamCompleter();
+    var controller = StreamController();
     var subscription = completer.stream.listen(null);
     Object lastEvent = 0;
     subscription.onData((value) => lastEvent = value);
@@ -294,8 +294,8 @@
   });
 
   test("pause w/ resume future accross setting stream", () async {
-    var completer = new StreamCompleter();
-    var resume = new Completer();
+    var completer = StreamCompleter();
+    var resume = Completer();
     var subscription = completer.stream.listen(unreachable("data"));
     subscription.pause(resume.future);
     await flushMicrotasks();
@@ -309,8 +309,8 @@
   });
 
   test("asFuture with error accross setting stream", () async {
-    var completer = new StreamCompleter();
-    var controller = new StreamController();
+    var completer = StreamCompleter();
+    var controller = StreamController();
     var subscription =
         completer.stream.listen(unreachable("data"), cancelOnError: false);
     var done = subscription.asFuture();
@@ -327,7 +327,7 @@
 
   group("setError()", () {
     test("produces a stream that emits a single error", () {
-      var completer = new StreamCompleter();
+      var completer = StreamCompleter();
       completer.stream.listen(unreachable("data"),
           onError: expectAsync2((error, stackTrace) {
         expect(error, equals("oh no"));
@@ -338,7 +338,7 @@
 
     test("produces a stream that emits a single error on a later listen",
         () async {
-      var completer = new StreamCompleter();
+      var completer = StreamCompleter();
       completer.setError("oh no");
       await flushMicrotasks();
 
diff --git a/test/stream_group_test.dart b/test/stream_group_test.dart
index 83b685c..3c4a3a8 100644
--- a/test/stream_group_test.dart
+++ b/test/stream_group_test.dart
@@ -11,16 +11,16 @@
   group("single-subscription", () {
     StreamGroup<String> streamGroup;
     setUp(() {
-      streamGroup = new StreamGroup<String>();
+      streamGroup = StreamGroup<String>();
     });
 
     test("buffers events from multiple sources", () async {
-      var controller1 = new StreamController<String>();
+      var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
       controller1.add("first");
       controller1.close();
 
-      var controller2 = new StreamController<String>();
+      var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
       controller2.add("second");
       controller2.close();
@@ -34,12 +34,12 @@
     });
 
     test("buffers errors from multiple sources", () async {
-      var controller1 = new StreamController<String>();
+      var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
       controller1.addError("first");
       controller1.close();
 
-      var controller2 = new StreamController<String>();
+      var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
       controller2.addError("second");
       controller2.close();
@@ -49,14 +49,14 @@
       expect(streamGroup.close(), completes);
 
       var transformed = streamGroup.stream.transform(
-          new StreamTransformer<String, String>.fromHandlers(
+          StreamTransformer<String, String>.fromHandlers(
               handleError: (error, _, sink) => sink.add("error: $error")));
       expect(transformed.toList(),
           completion(equals(["error: first", "error: second"])));
     });
 
     test("buffers events and errors together", () async {
-      var controller = new StreamController<String>();
+      var controller = StreamController<String>();
       streamGroup.add(controller.stream);
 
       controller.add("first");
@@ -72,7 +72,7 @@
       expect(streamGroup.close(), completes);
 
       var transformed = streamGroup.stream.transform(
-          new StreamTransformer<String, String>.fromHandlers(
+          StreamTransformer<String, String>.fromHandlers(
               handleData: (data, sink) => sink.add("data: $data"),
               handleError: (error, _, sink) => sink.add("error: $error")));
       expect(
@@ -88,7 +88,7 @@
     });
 
     test("emits events once there's a listener", () {
-      var controller = new StreamController<String>();
+      var controller = StreamController<String>();
       streamGroup.add(controller.stream);
 
       expect(
@@ -102,7 +102,7 @@
     });
 
     test("doesn't buffer events from a broadcast stream", () async {
-      var controller = new StreamController<String>.broadcast();
+      var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
       controller.add("first");
@@ -116,7 +116,7 @@
     });
 
     test("when paused, buffers events from a broadcast stream", () async {
-      var controller = new StreamController<String>.broadcast();
+      var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
       var events = [];
@@ -136,7 +136,7 @@
     });
 
     test("emits events from a broadcast stream once there's a listener", () {
-      var controller = new StreamController<String>.broadcast();
+      var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
       expect(
@@ -152,8 +152,7 @@
     test("forwards cancel errors", () async {
       var subscription = streamGroup.stream.listen(null);
 
-      var controller =
-          new StreamController<String>(onCancel: () => throw "error");
+      var controller = StreamController<String>(onCancel: () => throw "error");
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -163,9 +162,9 @@
     test("forwards a cancel future", () async {
       var subscription = streamGroup.stream.listen(null);
 
-      var completer = new Completer();
+      var completer = Completer();
       var controller =
-          new StreamController<String>(onCancel: () => completer.future);
+          StreamController<String>(onCancel: () => completer.future);
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -187,7 +186,7 @@
       await flushMicrotasks();
 
       var paused = false;
-      var controller = new StreamController<String>(
+      var controller = StreamController<String>(
           onPause: () => paused = true, onResume: () => paused = false);
 
       subscription.pause();
@@ -211,7 +210,7 @@
       test("immediately listens to and cancels the stream", () async {
         var listened = false;
         var canceled = false;
-        var controller = new StreamController<String>(onListen: () {
+        var controller = StreamController<String>(onListen: () {
           listened = true;
         }, onCancel: expectAsync0(() {
           expect(listened, isTrue);
@@ -226,15 +225,15 @@
 
       test("forwards cancel errors", () {
         var controller =
-            new StreamController<String>(onCancel: () => throw "error");
+            StreamController<String>(onCancel: () => throw "error");
 
         expect(streamGroup.add(controller.stream), throwsA("error"));
       });
 
       test("forwards a cancel future", () async {
-        var completer = new Completer();
+        var completer = Completer();
         var controller =
-            new StreamController<String>(onCancel: () => completer.future);
+            StreamController<String>(onCancel: () => completer.future);
 
         var fired = false;
         streamGroup.add(controller.stream).then((_) => fired = true);
@@ -252,16 +251,16 @@
   group("broadcast", () {
     StreamGroup<String> streamGroup;
     setUp(() {
-      streamGroup = new StreamGroup<String>.broadcast();
+      streamGroup = StreamGroup<String>.broadcast();
     });
 
     test("buffers events from multiple sources", () async {
-      var controller1 = new StreamController<String>();
+      var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
       controller1.add("first");
       controller1.close();
 
-      var controller2 = new StreamController<String>();
+      var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
       controller2.add("second");
       controller2.close();
@@ -275,10 +274,10 @@
     });
 
     test("emits events from multiple sources once there's a listener", () {
-      var controller1 = new StreamController<String>();
+      var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
 
-      var controller2 = new StreamController<String>();
+      var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
 
       expect(
@@ -294,7 +293,7 @@
 
     test("doesn't buffer events once a listener has been added and removed",
         () async {
-      var controller = new StreamController<String>();
+      var controller = StreamController<String>();
       streamGroup.add(controller.stream);
 
       streamGroup.stream.listen(null).cancel();
@@ -311,7 +310,7 @@
     });
 
     test("doesn't buffer events from a broadcast stream", () async {
-      var controller = new StreamController<String>.broadcast();
+      var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
       controller.add("first");
       controller.addError("second");
@@ -324,7 +323,7 @@
     });
 
     test("emits events from a broadcast stream once there's a listener", () {
-      var controller = new StreamController<String>.broadcast();
+      var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
       expect(
@@ -340,7 +339,7 @@
     test("cancels and re-listens broadcast streams", () async {
       var subscription = streamGroup.stream.listen(null);
 
-      var controller = new StreamController<String>.broadcast();
+      var controller = StreamController<String>.broadcast();
 
       streamGroup.add(controller.stream);
       await flushMicrotasks();
@@ -359,7 +358,7 @@
       var subscription = streamGroup.stream.listen(null);
 
       var controller =
-          new StreamController<String>(onCancel: expectAsync0(() {}, count: 0));
+          StreamController<String>(onCancel: expectAsync0(() {}, count: 0));
 
       streamGroup.add(controller.stream);
       await flushMicrotasks();
@@ -376,7 +375,7 @@
       var events = [];
       var subscription = streamGroup.stream.listen(events.add);
 
-      var controller = new StreamController<String>();
+      var controller = StreamController<String>();
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -396,7 +395,7 @@
     });
 
     test("a single-subscription stream can be removed while dormant", () async {
-      var controller = new StreamController<String>();
+      var controller = StreamController<String>();
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -415,17 +414,17 @@
 
   group("regardless of type", () {
     group("single-subscription", () {
-      regardlessOfType(() => new StreamGroup<String>());
+      regardlessOfType(() => StreamGroup<String>());
     });
 
     group("broadcast", () {
-      regardlessOfType(() => new StreamGroup<String>.broadcast());
+      regardlessOfType(() => StreamGroup<String>.broadcast());
     });
   });
 
   test("merge() emits events from all components streams", () {
-    var controller1 = new StreamController<String>();
-    var controller2 = new StreamController<String>();
+    var controller1 = StreamController<String>();
+    var controller2 = StreamController<String>();
 
     var merged = StreamGroup.merge([controller1.stream, controller2.stream]);
 
@@ -448,7 +447,7 @@
     group("while dormant", () {
       test("doesn't listen to the stream until the group is listened to",
           () async {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
 
         expect(streamGroup.add(controller.stream), isNull);
         await flushMicrotasks();
@@ -460,7 +459,7 @@
       });
 
       test("is a no-op if the stream is already in the group", () {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
         streamGroup.add(controller.stream);
         streamGroup.add(controller.stream);
         streamGroup.add(controller.stream);
@@ -478,7 +477,7 @@
       });
 
       test("listens to the stream immediately", () async {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
 
         expect(streamGroup.add(controller.stream), isNull);
         await flushMicrotasks();
@@ -486,7 +485,7 @@
       });
 
       test("is a no-op if the stream is already in the group", () async {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
 
         // If the stream were actually listened to more than once, future
         // calls to [add] would throw [StateError]s.
@@ -500,7 +499,7 @@
   group("remove()", () {
     group("while dormant", () {
       test("stops emitting events for a stream that's removed", () async {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
         streamGroup.add(controller.stream);
 
         expect(streamGroup.stream.toList(), completion(equals(["first"])));
@@ -514,14 +513,14 @@
       });
 
       test("is a no-op for an unknown stream", () {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
         expect(streamGroup.remove(controller.stream), isNull);
       });
 
       test("and closed closes the group when the last stream is removed",
           () async {
-        var controller1 = new StreamController<String>();
-        var controller2 = new StreamController<String>();
+        var controller1 = StreamController<String>();
+        var controller2 = StreamController<String>();
 
         streamGroup.add(controller1.stream);
         streamGroup.add(controller2.stream);
@@ -541,7 +540,7 @@
 
     group("while listening", () {
       test("doesn't emit events from a removed stream", () {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
         streamGroup.add(controller.stream);
 
         // The subscription to [controller.stream] is canceled synchronously, so
@@ -557,7 +556,7 @@
       });
 
       test("cancels the stream's subscription", () async {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
         streamGroup.add(controller.stream);
 
         streamGroup.stream.listen(null);
@@ -571,7 +570,7 @@
 
       test("forwards cancel errors", () async {
         var controller =
-            new StreamController<String>(onCancel: () => throw "error");
+            StreamController<String>(onCancel: () => throw "error");
         streamGroup.add(controller.stream);
 
         streamGroup.stream.listen(null);
@@ -581,9 +580,9 @@
       });
 
       test("forwards cancel futures", () async {
-        var completer = new Completer();
+        var completer = Completer();
         var controller =
-            new StreamController<String>(onCancel: () => completer.future);
+            StreamController<String>(onCancel: () => completer.future);
 
         streamGroup.stream.listen(null);
         await flushMicrotasks();
@@ -603,7 +602,7 @@
       });
 
       test("is a no-op for an unknown stream", () async {
-        var controller = new StreamController<String>();
+        var controller = StreamController<String>();
         streamGroup.stream.listen(null);
         await flushMicrotasks();
 
@@ -616,8 +615,8 @@
         streamGroup.stream.listen(null, onDone: () => done = true);
         await flushMicrotasks();
 
-        var controller1 = new StreamController<String>();
-        var controller2 = new StreamController<String>();
+        var controller1 = StreamController<String>();
+        var controller2 = StreamController<String>();
 
         streamGroup.add(controller1.stream);
         streamGroup.add(controller2.stream);
@@ -646,8 +645,8 @@
       test(
           "if there are streams, closes the group once those streams close "
           "and there's a listener", () async {
-        var controller1 = new StreamController<String>();
-        var controller2 = new StreamController<String>();
+        var controller1 = StreamController<String>();
+        var controller2 = StreamController<String>();
 
         streamGroup.add(controller1.stream);
         streamGroup.add(controller2.stream);
@@ -673,8 +672,8 @@
         streamGroup.stream.listen(null, onDone: () => done = true);
         await flushMicrotasks();
 
-        var controller1 = new StreamController<String>();
-        var controller2 = new StreamController<String>();
+        var controller1 = StreamController<String>();
+        var controller2 = StreamController<String>();
 
         streamGroup.add(controller1.stream);
         streamGroup.add(controller2.stream);
@@ -699,7 +698,7 @@
       var events = [];
       streamGroup.stream.listen(events.add);
 
-      var controller = new StreamController<String>();
+      var controller = StreamController<String>();
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -721,4 +720,4 @@
 }
 
 /// Wait for all microtasks to complete.
-Future flushMicrotasks() => new Future.delayed(Duration.zero);
+Future flushMicrotasks() => Future.delayed(Duration.zero);
diff --git a/test/stream_queue_test.dart b/test/stream_queue_test.dart
index 37dedb9..aaf1227 100644
--- a/test/stream_queue_test.dart
+++ b/test/stream_queue_test.dart
@@ -12,8 +12,8 @@
 main() {
   group("source stream", () {
     test("is listened to on first request, paused between requests", () async {
-      var controller = new StreamController<int>();
-      var events = new StreamQueue<int>(controller.stream);
+      var controller = StreamController<int>();
+      var events = StreamQueue<int>(controller.stream);
       await flushMicrotasks();
       expect(controller.hasListener, isFalse);
 
@@ -44,7 +44,7 @@
 
   group("eventsDispatched", () {
     test("increments after a next future completes", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
 
       expect(events.eventsDispatched, equals(0));
       await flushMicrotasks();
@@ -61,13 +61,13 @@
     });
 
     test("increments multiple times for multi-value requests", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       await events.take(3);
       expect(events.eventsDispatched, equals(3));
     });
 
     test("increments multiple times for an accepted transaction", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       await events.withTransaction((queue) async {
         await queue.next;
         await queue.next;
@@ -77,7 +77,7 @@
     });
 
     test("doesn't increment for rest requests", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       await events.rest.toList();
       expect(events.eventsDispatched, equals(0));
     });
@@ -85,7 +85,7 @@
 
   group("lookAhead operation", () {
     test("as simple list of events", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.lookAhead(4), [1, 2, 3, 4]);
       expect(await events.next, 1);
       expect(await events.lookAhead(2), [2, 3]);
@@ -95,7 +95,7 @@
     });
 
     test("of 0 events", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(events.lookAhead(0), completion([]));
       expect(events.next, completion(1));
       expect(events.lookAhead(0), completion([]));
@@ -111,7 +111,7 @@
     });
 
     test("with bad arguments throws", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(() => events.lookAhead(-1), throwsArgumentError);
       expect(await events.next, 1); // Did not consume event.
       expect(() => events.lookAhead(-1), throwsArgumentError);
@@ -120,13 +120,13 @@
     });
 
     test("of too many arguments", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.lookAhead(6), [1, 2, 3, 4]);
       await events.cancel();
     });
 
     test("too large later", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.lookAhead(6), [3, 4]);
@@ -134,7 +134,7 @@
     });
 
     test("error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(events.lookAhead(4), throwsA("To err is divine!"));
       expect(events.take(4), throwsA("To err is divine!"));
       expect(await events.next, 4);
@@ -144,7 +144,7 @@
 
   group("next operation", () {
     test("simple sequence of requests", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       for (int i = 1; i <= 4; i++) {
         expect(await events.next, i);
       }
@@ -152,7 +152,7 @@
     });
 
     test("multiple requests at the same time", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var result = await Future.wait(
           [events.next, events.next, events.next, events.next]);
       expect(result, [1, 2, 3, 4]);
@@ -160,7 +160,7 @@
     });
 
     test("sequence of requests with error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(events.next, throwsA("To err is divine!"));
@@ -171,7 +171,7 @@
 
   group("skip operation", () {
     test("of two elements in the middle of sequence", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.skip(2), 0);
       expect(await events.next, 4);
@@ -179,7 +179,7 @@
     });
 
     test("with negative/bad arguments throws", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(() => events.skip(-1), throwsArgumentError);
       // A non-int throws either a type error or an argument error,
       // depending on whether it's checked mode or not.
@@ -190,7 +190,7 @@
     });
 
     test("of 0 elements works", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(events.skip(0), completion(0));
       expect(events.next, completion(1));
       expect(events.skip(0), completion(0));
@@ -206,13 +206,13 @@
     });
 
     test("of too many events ends at stream start", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.skip(6), 2);
       await events.cancel();
     });
 
     test("of too many events after some events", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.skip(6), 4);
@@ -220,7 +220,7 @@
     });
 
     test("of too many events ends at stream end", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.next, 3);
@@ -230,20 +230,20 @@
     });
 
     test("of events with error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(events.skip(4), throwsA("To err is divine!"));
       expect(await events.next, 4);
       await events.cancel();
     });
 
     test("of events with error, and skip again after", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(events.skip(4), throwsA("To err is divine!"));
       expect(events.skip(2), completion(1));
       await events.cancel();
     });
     test("multiple skips at same time complete in order.", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var skip1 = events.skip(1);
       var skip2 = events.skip(0);
       var skip3 = events.skip(4);
@@ -267,7 +267,7 @@
 
   group("take operation", () {
     test("as simple take of events", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.take(2), [2, 3]);
       expect(await events.next, 4);
@@ -275,7 +275,7 @@
     });
 
     test("of 0 events", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(events.take(0), completion([]));
       expect(events.next, completion(1));
       expect(events.take(0), completion([]));
@@ -291,7 +291,7 @@
     });
 
     test("with bad arguments throws", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(() => events.take(-1), throwsArgumentError);
       expect(await events.next, 1); // Did not consume event.
       expect(() => events.take(-1), throwsArgumentError);
@@ -300,13 +300,13 @@
     });
 
     test("of too many arguments", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.take(6), [1, 2, 3, 4]);
       await events.cancel();
     });
 
     test("too large later", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.take(6), [3, 4]);
@@ -314,7 +314,7 @@
     });
 
     test("error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(events.take(4), throwsA("To err is divine!"));
       expect(await events.next, 4);
       await events.cancel();
@@ -323,18 +323,18 @@
 
   group("rest operation", () {
     test("after single next", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.rest.toList(), [2, 3, 4]);
     });
 
     test("at start", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.rest.toList(), [1, 2, 3, 4]);
     });
 
     test("at end", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.next, 3);
@@ -343,7 +343,7 @@
     });
 
     test("after end", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.next, 3);
@@ -353,7 +353,7 @@
     });
 
     test("after receiving done requested before", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var next1 = events.next;
       var next2 = events.next;
       var next3 = events.next;
@@ -368,17 +368,17 @@
     });
 
     test("with an error event error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       var rest = events.rest;
-      var events2 = new StreamQueue(rest);
+      var events2 = StreamQueue(rest);
       expect(await events2.next, 2);
       expect(events2.next, throwsA("To err is divine!"));
       expect(await events2.next, 4);
     });
 
     test("closes the events, prevents other operations", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var stream = events.rest;
       expect(() => events.next, throwsStateError);
       expect(() => events.skip(1), throwsStateError);
@@ -389,9 +389,9 @@
     });
 
     test("forwards to underlying stream", () async {
-      var cancel = new Completer();
-      var controller = new StreamController<int>(onCancel: () => cancel.future);
-      var events = new StreamQueue<int>(controller.stream);
+      var cancel = Completer();
+      var controller = StreamController<int>(onCancel: () => cancel.future);
+      var events = StreamQueue<int>(controller.stream);
       expect(controller.hasListener, isFalse);
       var next = events.next;
       expect(controller.hasListener, isTrue);
@@ -437,7 +437,7 @@
 
   group("peek operation", () {
     test("peeks one event", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.peek, 1);
       expect(await events.next, 1);
       expect(await events.peek, 2);
@@ -449,14 +449,14 @@
       await events.cancel();
     });
     test("multiple requests at the same time", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var result = await Future.wait(
           [events.peek, events.peek, events.next, events.peek, events.peek]);
       expect(result, [1, 1, 1, 2, 2]);
       await events.cancel();
     });
     test("sequence of requests with error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(events.peek, throwsA("To err is divine!"));
@@ -470,7 +470,7 @@
 
   group("cancel operation", () {
     test("closes the events, prevents any other operation", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       await events.cancel();
       expect(() => events.lookAhead(1), throwsStateError);
       expect(() => events.next, throwsStateError);
@@ -483,16 +483,16 @@
 
     test("cancels underlying subscription when called before any event",
         () async {
-      var cancelFuture = new Future.value(42);
-      var controller = new StreamController<int>(onCancel: () => cancelFuture);
-      var events = new StreamQueue<int>(controller.stream);
+      var cancelFuture = Future.value(42);
+      var controller = StreamController<int>(onCancel: () => cancelFuture);
+      var events = StreamQueue<int>(controller.stream);
       expect(await events.cancel(), 42);
     });
 
     test("cancels underlying subscription, returns result", () async {
-      var cancelFuture = new Future.value(42);
-      var controller = new StreamController<int>(onCancel: () => cancelFuture);
-      var events = new StreamQueue<int>(controller.stream);
+      var cancelFuture = Future.value(42);
+      var controller = StreamController<int>(onCancel: () => cancelFuture);
+      var events = StreamQueue<int>(controller.stream);
       controller.add(1);
       expect(await events.next, 1);
       expect(await events.cancel(), 42);
@@ -500,7 +500,7 @@
 
     group("with immediate: true", () {
       test("closes the events, prevents any other operation", () async {
-        var events = new StreamQueue<int>(createStream());
+        var events = StreamQueue<int>(createStream());
         await events.cancel(immediate: true);
         expect(() => events.next, throwsStateError);
         expect(() => events.skip(1), throwsStateError);
@@ -510,10 +510,10 @@
       });
 
       test("cancels the underlying subscription immediately", () async {
-        var controller = new StreamController<int>();
+        var controller = StreamController<int>();
         controller.add(1);
 
-        var events = new StreamQueue<int>(controller.stream);
+        var events = StreamQueue<int>(controller.stream);
         expect(await events.next, 1);
         expect(controller.hasListener, isTrue);
 
@@ -523,16 +523,15 @@
 
       test("cancels the underlying subscription when called before any event",
           () async {
-        var cancelFuture = new Future.value(42);
-        var controller =
-            new StreamController<int>(onCancel: () => cancelFuture);
+        var cancelFuture = Future.value(42);
+        var controller = StreamController<int>(onCancel: () => cancelFuture);
 
-        var events = new StreamQueue<int>(controller.stream);
+        var events = StreamQueue<int>(controller.stream);
         expect(await events.cancel(immediate: true), 42);
       });
 
       test("closes pending requests", () async {
-        var events = new StreamQueue<int>(createStream());
+        var events = StreamQueue<int>(createStream());
         expect(await events.next, 1);
         expect(events.next, throwsStateError);
         expect(events.hasNext, completion(isFalse));
@@ -543,8 +542,8 @@
       test("returns the result of closing the underlying subscription",
           () async {
         var controller =
-            new StreamController<int>(onCancel: () => new Future.value(42));
-        var events = new StreamQueue<int>(controller.stream);
+            StreamController<int>(onCancel: () => Future.value(42));
+        var events = StreamQueue<int>(controller.stream);
         expect(await events.cancel(immediate: true), 42);
       });
 
@@ -552,8 +551,8 @@
           () async {
         var wasListened = false;
         var controller =
-            new StreamController<int>(onListen: () => wasListened = true);
-        var events = new StreamQueue<int>(controller.stream);
+            StreamController<int>(onListen: () => wasListened = true);
+        var events = StreamQueue<int>(controller.stream);
         expect(wasListened, isFalse);
         expect(controller.hasListener, isFalse);
 
@@ -566,18 +565,18 @@
 
   group("hasNext operation", () {
     test("true at start", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.hasNext, isTrue);
     });
 
     test("true after start", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, isTrue);
     });
 
     test("true at end", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       for (int i = 1; i <= 4; i++) {
         expect(await events.next, i);
       }
@@ -585,7 +584,7 @@
     });
 
     test("true when enqueued", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var values = <int>[];
       for (int i = 1; i <= 3; i++) {
         events.next.then(values.add);
@@ -596,7 +595,7 @@
     });
 
     test("false when enqueued", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var values = <int>[];
       for (int i = 1; i <= 4; i++) {
         events.next.then(values.add);
@@ -607,8 +606,8 @@
     });
 
     test("true when data event", () async {
-      var controller = new StreamController<int>();
-      var events = new StreamQueue<int>(controller.stream);
+      var controller = StreamController<int>();
+      var events = StreamQueue<int>(controller.stream);
 
       bool hasNext;
       events.hasNext.then((result) {
@@ -623,8 +622,8 @@
     });
 
     test("true when error event", () async {
-      var controller = new StreamController<int>();
-      var events = new StreamQueue<int>(controller.stream);
+      var controller = StreamController<int>();
+      var events = StreamQueue<int>(controller.stream);
 
       bool hasNext;
       events.hasNext.then((result) {
@@ -640,7 +639,7 @@
     });
 
     test("- hasNext after hasNext", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.hasNext, true);
       expect(await events.hasNext, true);
       expect(await events.next, 1);
@@ -658,7 +657,7 @@
     });
 
     test("- next after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.next, 2);
@@ -666,7 +665,7 @@
     });
 
     test("- next after true, enqueued", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       var responses = <Object>[];
       events.next.then(responses.add);
       events.hasNext.then(responses.add);
@@ -678,7 +677,7 @@
     });
 
     test("- skip 0 after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.skip(0), 0);
@@ -686,7 +685,7 @@
     });
 
     test("- skip 1 after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.skip(1), 0);
@@ -694,7 +693,7 @@
     });
 
     test("- skip 2 after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.skip(2), 0);
@@ -702,7 +701,7 @@
     });
 
     test("- take 0 after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.take(0), isEmpty);
@@ -710,7 +709,7 @@
     });
 
     test("- take 1 after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.take(1), [2]);
@@ -718,7 +717,7 @@
     });
 
     test("- take 2 after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       expect(await events.take(2), [2, 3]);
@@ -726,7 +725,7 @@
     });
 
     test("- rest after true", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
       var stream = events.rest;
@@ -734,7 +733,7 @@
     });
 
     test("- rest after true, at last", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.next, 3);
@@ -744,7 +743,7 @@
     });
 
     test("- rest after false", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.next, 3);
@@ -755,7 +754,7 @@
     });
 
     test("- cancel after true on data", () async {
-      var events = new StreamQueue<int>(createStream());
+      var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.hasNext, true);
@@ -763,7 +762,7 @@
     });
 
     test("- cancel after true on error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
+      var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
       expect(await events.hasNext, true);
@@ -777,7 +776,7 @@
     StreamQueue<int> queue1;
     StreamQueue<int> queue2;
     setUp(() async {
-      events = new StreamQueue(createStream());
+      events = StreamQueue(createStream());
       expect(await events.next, 1);
       transaction = events.startTransaction();
       queue1 = transaction.newQueue();
@@ -808,7 +807,7 @@
       });
 
       test("independently emit errors", () async {
-        events = new StreamQueue(createErrorStream());
+        events = StreamQueue(createErrorStream());
         expect(await events.next, 1);
         transaction = events.startTransaction();
         queue1 = transaction.newQueue();
@@ -872,8 +871,8 @@
 
       // Regression test.
       test("pending child rest requests emit no more events", () async {
-        var controller = new StreamController();
-        var events = new StreamQueue(controller.stream);
+        var controller = StreamController();
+        var events = StreamQueue(controller.stream);
         var transaction = events.startTransaction();
         var queue = transaction.newQueue();
 
@@ -906,8 +905,8 @@
       });
 
       test("before the transaction emits any events, does nothing", () async {
-        var controller = new StreamController();
-        var events = new StreamQueue(controller.stream);
+        var controller = StreamController();
+        var events = StreamQueue(controller.stream);
 
         // Queue a request before the transaction, but don't let it complete
         // until we're done with the transaction.
@@ -983,8 +982,8 @@
       });
 
       test("before the transaction emits any events, does nothing", () async {
-        var controller = new StreamController();
-        var events = new StreamQueue(controller.stream);
+        var controller = StreamController();
+        var events = StreamQueue(controller.stream);
 
         // Queue a request before the transaction, but don't let it complete
         // until we're done with the transaction.
@@ -1006,7 +1005,7 @@
   group("withTransaction operation", () {
     StreamQueue<int> events;
     setUp(() async {
-      events = new StreamQueue(createStream());
+      events = StreamQueue(createStream());
       expect(await events.next, 1);
     });
 
@@ -1060,7 +1059,7 @@
   group("cancelable operation", () {
     StreamQueue<int> events;
     setUp(() async {
-      events = new StreamQueue(createStream());
+      events = StreamQueue(createStream());
       expect(await events.next, 1);
     });
 
@@ -1120,7 +1119,7 @@
     // doing rest. Each of the first rounds do 10 events of each type,
     // the rest does 20 elements.
     var eventCount = 20 * (3 * 3 + 1);
-    var events = new StreamQueue<int>(createLongStream(eventCount));
+    var events = StreamQueue<int>(createLongStream(eventCount));
 
     // Test expecting [startIndex .. startIndex + 9] as events using
     // `next`.
@@ -1139,7 +1138,7 @@
     // `take(10)`.
     takeTest(startIndex) {
       expect(events.take(10),
-          completion(new List.generate(10, (i) => startIndex + i)));
+          completion(List.generate(10, (i) => startIndex + i)));
     }
 
     var tests = [nextTest, skipTest, takeTest];
@@ -1155,11 +1154,11 @@
     }
     // Then expect 20 more events as a `rest` call.
     expect(events.rest.toList(),
-        completion(new List.generate(20, (i) => counter + i)));
+        completion(List.generate(20, (i) => counter + i)));
   });
 }
 
-typedef T Func1Required<T>(T value);
+typedef Func1Required<T> = T Function(T value);
 
 Stream<int> createStream() async* {
   yield 1;
@@ -1172,7 +1171,7 @@
 }
 
 Stream<int> createErrorStream() {
-  var controller = new StreamController<int>();
+  var controller = StreamController<int>();
   () async {
     controller.add(1);
     await flushMicrotasks();
diff --git a/test/stream_sink_completer_test.dart b/test/stream_sink_completer_test.dart
index a149a7f..56860ce 100644
--- a/test/stream_sink_completer_test.dart
+++ b/test/stream_sink_completer_test.dart
@@ -12,12 +12,12 @@
 main() {
   StreamSinkCompleter completer;
   setUp(() {
-    completer = new StreamSinkCompleter();
+    completer = StreamSinkCompleter();
   });
 
   group("when a stream is linked before events are added", () {
     test("data events are forwarded", () {
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       completer.sink..add(1)..add(2)..add(3)..add(4);
 
@@ -28,7 +28,7 @@
     });
 
     test("error events are forwarded", () {
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       completer.sink..addError("oh no")..addError("that's bad");
 
@@ -37,10 +37,10 @@
     });
 
     test("addStream is forwarded", () async {
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
 
-      var controller = new StreamController();
+      var controller = StreamController();
       completer.sink.addStream(controller.stream);
 
       controller.add(1);
@@ -61,15 +61,15 @@
     });
 
     test("close() is forwarded", () {
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       completer.sink.close();
       expect(sink.isClosed, isTrue);
     });
 
     test("the future from the inner close() is returned", () async {
-      var closeCompleter = new Completer();
-      var sink = new TestSink(onDone: () => closeCompleter.future);
+      var closeCompleter = Completer();
+      var sink = TestSink(onDone: () => closeCompleter.future);
       completer.setDestinationSink(sink);
 
       var closeCompleted = false;
@@ -86,14 +86,14 @@
     });
 
     test("errors are forwarded from the inner close()", () {
-      var sink = new TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw "oh no");
       completer.setDestinationSink(sink);
       expect(completer.sink.done, throwsA("oh no"));
       expect(completer.sink.close(), throwsA("oh no"));
     });
 
     test("errors aren't top-leveled if only close() is listened to", () async {
-      var sink = new TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw "oh no");
       completer.setDestinationSink(sink);
       expect(completer.sink.close(), throwsA("oh no"));
 
@@ -102,7 +102,7 @@
     });
 
     test("errors aren't top-leveled if only done is listened to", () async {
-      var sink = new TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw "oh no");
       completer.setDestinationSink(sink);
       completer.sink.close();
       expect(completer.sink.done, throwsA("oh no"));
@@ -117,7 +117,7 @@
       completer.sink..add(1)..add(2)..add(3)..add(4);
       await flushMicrotasks();
 
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       await flushMicrotasks();
 
@@ -131,7 +131,7 @@
       completer.sink..addError("oh no")..addError("that's bad");
       await flushMicrotasks();
 
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       await flushMicrotasks();
 
@@ -140,7 +140,7 @@
     });
 
     test("addStream is forwarded", () async {
-      var controller = new StreamController();
+      var controller = StreamController();
       completer.sink.addStream(controller.stream);
 
       controller.add(1);
@@ -150,7 +150,7 @@
       controller.close();
       await flushMicrotasks();
 
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       await flushMicrotasks();
 
@@ -165,7 +165,7 @@
       completer.sink.close();
       await flushMicrotasks();
 
-      var sink = new TestSink();
+      var sink = TestSink();
       completer.setDestinationSink(sink);
       await flushMicrotasks();
 
@@ -179,8 +179,8 @@
       }));
       await flushMicrotasks();
 
-      var closeCompleter = new Completer();
-      var sink = new TestSink(onDone: () => closeCompleter.future);
+      var closeCompleter = Completer();
+      var sink = TestSink(onDone: () => closeCompleter.future);
       completer.setDestinationSink(sink);
       await flushMicrotasks();
       expect(closeCompleted, isFalse);
@@ -195,7 +195,7 @@
       expect(completer.sink.close(), throwsA("oh no"));
       await flushMicrotasks();
 
-      var sink = new TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw "oh no");
       completer.setDestinationSink(sink);
     });
 
@@ -203,7 +203,7 @@
       expect(completer.sink.close(), throwsA("oh no"));
       await flushMicrotasks();
 
-      var sink = new TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw "oh no");
       completer.setDestinationSink(sink);
 
       // Give the event loop a chance to top-level errors if it's going to.
@@ -215,7 +215,7 @@
       expect(completer.sink.done, throwsA("oh no"));
       await flushMicrotasks();
 
-      var sink = new TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw "oh no");
       completer.setDestinationSink(sink);
 
       // Give the event loop a chance to top-level errors if it's going to.
@@ -228,7 +228,7 @@
     expect(completer.sink.close(), completes);
     await flushMicrotasks();
 
-    completer.setDestinationSink(new TestSink());
+    completer.setDestinationSink(TestSink());
     await flushMicrotasks();
 
     expect(completer.sink.done, completes);
@@ -239,7 +239,7 @@
     expect(completer.sink.done, completes);
     await flushMicrotasks();
 
-    completer.setDestinationSink(new TestSink());
+    completer.setDestinationSink(TestSink());
     await flushMicrotasks();
 
     expect(completer.sink.close(), completes);
@@ -247,14 +247,14 @@
 
   group("fromFuture()", () {
     test("with a successful completion", () async {
-      var futureCompleter = new Completer<StreamSink>();
+      var futureCompleter = Completer<StreamSink>();
       var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
       sink.add(1);
       sink.add(2);
       sink.add(3);
       sink.close();
 
-      var testSink = new TestSink();
+      var testSink = TestSink();
       futureCompleter.complete(testSink);
       await testSink.done;
 
@@ -264,7 +264,7 @@
     });
 
     test("with an error", () async {
-      var futureCompleter = new Completer<StreamSink>();
+      var futureCompleter = Completer<StreamSink>();
       var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
       expect(sink.done, throwsA("oh no"));
       futureCompleter.completeError("oh no");
@@ -288,10 +288,8 @@
   });
 
   test("doesn't allow the destination sink to be set multiple times", () {
-    completer.setDestinationSink(new TestSink());
-    expect(
-        () => completer.setDestinationSink(new TestSink()), throwsStateError);
-    expect(
-        () => completer.setDestinationSink(new TestSink()), throwsStateError);
+    completer.setDestinationSink(TestSink());
+    expect(() => completer.setDestinationSink(TestSink()), throwsStateError);
+    expect(() => completer.setDestinationSink(TestSink()), throwsStateError);
   });
 }
diff --git a/test/stream_sink_transformer_test.dart b/test/stream_sink_transformer_test.dart
index 552bdaa..5e981a6 100644
--- a/test/stream_sink_transformer_test.dart
+++ b/test/stream_sink_transformer_test.dart
@@ -12,13 +12,13 @@
 void main() {
   StreamController controller;
   setUp(() {
-    controller = new StreamController();
+    controller = StreamController();
   });
 
   group("fromStreamTransformer", () {
     test("transforms data events", () {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(handleData: (i, sink) {
+      var transformer = StreamSinkTransformer.fromStreamTransformer(
+          StreamTransformer.fromHandlers(handleData: (i, sink) {
         sink.add(i * 2);
       }));
       var sink = transformer.bind(controller.sink);
@@ -35,9 +35,8 @@
     });
 
     test("transforms error events", () {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(
-              handleError: (i, stackTrace, sink) {
+      var transformer = StreamSinkTransformer.fromStreamTransformer(
+          StreamTransformer.fromHandlers(handleError: (i, stackTrace, sink) {
         sink.addError((i as num) * 2, stackTrace);
       }));
       var sink = transformer.bind(controller.sink);
@@ -57,8 +56,8 @@
     });
 
     test("transforms done events", () {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(handleDone: (sink) {
+      var transformer = StreamSinkTransformer.fromStreamTransformer(
+          StreamTransformer.fromHandlers(handleDone: (sink) {
         sink.add(1);
         sink.close();
       }));
@@ -73,16 +72,16 @@
     });
 
     test("forwards the future from inner.close", () async {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers());
-      var innerSink = new CompleterStreamSink();
+      var transformer = StreamSinkTransformer.fromStreamTransformer(
+          StreamTransformer.fromHandlers());
+      var innerSink = CompleterStreamSink();
       var sink = transformer.bind(innerSink);
 
       // The futures shouldn't complete until the inner sink's close future
       // completes.
-      var doneResult = new ResultFuture(sink.done);
+      var doneResult = ResultFuture(sink.done);
       doneResult.catchError((_) {});
-      var closeResult = new ResultFuture(sink.close());
+      var closeResult = ResultFuture(sink.close());
       closeResult.catchError((_) {});
       await flushMicrotasks();
       expect(doneResult.isComplete, isFalse);
@@ -96,11 +95,11 @@
     });
 
     test("doesn't top-level the future from inner.close", () async {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(handleData: (_, sink) {
+      var transformer = StreamSinkTransformer.fromStreamTransformer(
+          StreamTransformer.fromHandlers(handleData: (_, sink) {
         sink.close();
       }));
-      var innerSink = new CompleterStreamSink();
+      var innerSink = CompleterStreamSink();
       var sink = transformer.bind(innerSink);
 
       // This will close the inner sink, but it shouldn't top-level the error.
@@ -118,7 +117,7 @@
   group("fromHandlers", () {
     test("transforms data events", () {
       var transformer =
-          new StreamSinkTransformer.fromHandlers(handleData: (i, sink) {
+          StreamSinkTransformer.fromHandlers(handleData: (i, sink) {
         sink.add(i * 2);
       });
       var sink = transformer.bind(controller.sink);
@@ -135,7 +134,7 @@
     });
 
     test("transforms error events", () {
-      var transformer = new StreamSinkTransformer.fromHandlers(
+      var transformer = StreamSinkTransformer.fromHandlers(
           handleError: (i, stackTrace, sink) {
         sink.addError((i as num) * 2, stackTrace);
       });
@@ -156,8 +155,7 @@
     });
 
     test("transforms done events", () {
-      var transformer =
-          new StreamSinkTransformer.fromHandlers(handleDone: (sink) {
+      var transformer = StreamSinkTransformer.fromHandlers(handleDone: (sink) {
         sink.add(1);
         sink.close();
       });
@@ -172,15 +170,15 @@
     });
 
     test("forwards the future from inner.close", () async {
-      var transformer = new StreamSinkTransformer.fromHandlers();
-      var innerSink = new CompleterStreamSink();
+      var transformer = StreamSinkTransformer.fromHandlers();
+      var innerSink = CompleterStreamSink();
       var sink = transformer.bind(innerSink);
 
       // The futures shouldn't complete until the inner sink's close future
       // completes.
-      var doneResult = new ResultFuture(sink.done);
+      var doneResult = ResultFuture(sink.done);
       doneResult.catchError((_) {});
-      var closeResult = new ResultFuture(sink.close());
+      var closeResult = ResultFuture(sink.close());
       closeResult.catchError((_) {});
       await flushMicrotasks();
       expect(doneResult.isComplete, isFalse);
@@ -195,10 +193,10 @@
 
     test("doesn't top-level the future from inner.close", () async {
       var transformer =
-          new StreamSinkTransformer.fromHandlers(handleData: (_, sink) {
+          StreamSinkTransformer.fromHandlers(handleData: (_, sink) {
         sink.close();
       });
-      var innerSink = new CompleterStreamSink();
+      var innerSink = CompleterStreamSink();
       var sink = transformer.bind(innerSink);
 
       // This will close the inner sink, but it shouldn't top-level the error.
diff --git a/test/stream_splitter_test.dart b/test/stream_splitter_test.dart
index c118b12..497f125 100644
--- a/test/stream_splitter_test.dart
+++ b/test/stream_splitter_test.dart
@@ -11,8 +11,8 @@
   StreamController<int> controller;
   StreamSplitter splitter;
   setUp(() {
-    controller = new StreamController<int>();
-    splitter = new StreamSplitter<int>(controller.stream);
+    controller = StreamController<int>();
+    splitter = StreamSplitter<int>(controller.stream);
   });
 
   test("a branch that's created before the stream starts to replay it",
@@ -289,4 +289,4 @@
 }
 
 /// Wait for all microtasks to complete.
-Future flushMicrotasks() => new Future.delayed(Duration.zero);
+Future flushMicrotasks() => Future.delayed(Duration.zero);
diff --git a/test/stream_zip_test.dart b/test/stream_zip_test.dart
index 018c8ab..1e5f524 100644
--- a/test/stream_zip_test.dart
+++ b/test/stream_zip_test.dart
@@ -17,10 +17,10 @@
 /// at periodic intervals.
 Stream mks(Iterable iterable) {
   Iterator iterator = iterable.iterator;
-  StreamController controller = new StreamController();
+  StreamController controller = StreamController();
   // Some varying time between 3 and 10 ms.
   int ms = ((++ctr) * 5) % 7 + 3;
-  new Timer.periodic(new Duration(milliseconds: ms), (Timer timer) {
+  Timer.periodic(Duration(milliseconds: ms), (Timer timer) {
     if (iterator.moveNext()) {
       controller.add(iterator.current);
     } else {
@@ -38,7 +38,7 @@
   // Test that zipping [streams] gives the results iterated by [expectedData].
   testZip(Iterable<Stream> streams, Iterable expectedData) {
     List data = [];
-    Stream zip = new StreamZip(streams);
+    Stream zip = StreamZip(streams);
     zip.listen(data.add, onDone: expectAsync0(() {
       expect(data, equals(expectedData));
     }));
@@ -145,9 +145,8 @@
   test("Other-streams", () {
     Stream st1 = mks([1, 2, 3, 4, 5, 6]).where((x) => x < 4);
     Stream st2 =
-        new Stream.periodic(const Duration(milliseconds: 5), (x) => x + 4)
-            .take(3);
-    StreamController c = new StreamController.broadcast();
+        Stream.periodic(const Duration(milliseconds: 5), (x) => x + 4).take(3);
+    StreamController c = StreamController.broadcast();
     Stream st3 = c.stream;
     testZip([
       st1,
@@ -167,7 +166,7 @@
 
   test("Error 1", () {
     expect(
-        new StreamZip([
+        StreamZip([
           streamError(mks([1, 2, 3]), 2, "BAD-1"),
           mks([4, 5, 6]),
           mks([7, 8, 9])
@@ -177,7 +176,7 @@
 
   test("Error 2", () {
     expect(
-        new StreamZip([
+        StreamZip([
           mks([1, 2, 3]),
           streamError(mks([4, 5, 6]), 5, "BAD-2"),
           mks([7, 8, 9])
@@ -187,7 +186,7 @@
 
   test("Error 3", () {
     expect(
-        new StreamZip([
+        StreamZip([
           mks([1, 2, 3]),
           mks([4, 5, 6]),
           streamError(mks([7, 8, 9]), 8, "BAD-3")
@@ -197,7 +196,7 @@
 
   test("Error at end", () {
     expect(
-        new StreamZip([
+        StreamZip([
           mks([1, 2, 3]),
           streamError(mks([4, 5, 6]), 6, "BAD-4"),
           mks([7, 8, 9])
@@ -209,21 +208,21 @@
     // StreamControllers' streams with no "close" called will never be done,
     // so the fourth event of the first stream is guaranteed to come first.
     expect(
-        new StreamZip([
+        StreamZip([
           streamError(mks([1, 2, 3, 4]), 4, "BAD-5"),
-          (new StreamController()..add(4)..add(5)..add(6)).stream,
-          (new StreamController()..add(7)..add(8)..add(9)).stream
+          (StreamController()..add(4)..add(5)..add(6)).stream,
+          (StreamController()..add(7)..add(8)..add(9)).stream
         ]).toList(),
         throwsA(equals("BAD-5")));
   });
 
   test("Error after first end", () {
-    StreamController controller = new StreamController();
+    StreamController controller = StreamController();
     controller..add(7)..add(8)..add(9);
     // Transformer that puts error into controller when one of the first two
     // streams have sent a done event.
     StreamTransformer trans =
-        new StreamTransformer.fromHandlers(handleDone: (EventSink s) {
+        StreamTransformer.fromHandlers(handleDone: (EventSink s) {
       Timer.run(() {
         controller.addError("BAD-6");
       });
@@ -242,14 +241,14 @@
 
   test("Pause/Resume", () {
     int sc1p = 0;
-    StreamController c1 = new StreamController(onPause: () {
+    StreamController c1 = StreamController(onPause: () {
       sc1p++;
     }, onResume: () {
       sc1p--;
     });
 
     int sc2p = 0;
-    StreamController c2 = new StreamController(onPause: () {
+    StreamController c2 = StreamController(onPause: () {
       sc2p++;
     }, onResume: () {
       sc2p--;
@@ -260,12 +259,12 @@
       expect(sc2p, equals(0));
     }); // Call to complete test.
 
-    Stream zip = new StreamZip([c1.stream, c2.stream]);
+    Stream zip = StreamZip([c1.stream, c2.stream]);
 
-    const ms25 = const Duration(milliseconds: 25);
+    const ms25 = Duration(milliseconds: 25);
 
     // StreamIterator uses pause and resume to control flow.
-    StreamIterator it = new StreamIterator(zip);
+    StreamIterator it = StreamIterator(zip);
 
     it.moveNext().then((hasMore) {
       expect(hasMore, isTrue);
@@ -279,7 +278,7 @@
     }).then((hasMore) {
       expect(hasMore, isTrue);
       expect(it.current, equals([5, 6]));
-      new Future.delayed(ms25).then((_) {
+      Future.delayed(ms25).then((_) {
         c2.add(8);
       });
       return it.moveNext();
@@ -303,18 +302,18 @@
   });
 
   test("pause-resume2", () {
-    var s1 = new Stream.fromIterable([0, 2, 4, 6, 8]);
-    var s2 = new Stream.fromIterable([1, 3, 5, 7]);
-    var sz = new StreamZip([s1, s2]);
+    var s1 = Stream.fromIterable([0, 2, 4, 6, 8]);
+    var s2 = Stream.fromIterable([1, 3, 5, 7]);
+    var sz = StreamZip([s1, s2]);
     int ctr = 0;
     StreamSubscription sub;
     sub = sz.listen(expectAsync1((v) {
       expect(v, equals([ctr * 2, ctr * 2 + 1]));
       if (ctr == 1) {
-        sub.pause(new Future.delayed(const Duration(milliseconds: 25)));
+        sub.pause(Future.delayed(const Duration(milliseconds: 25)));
       } else if (ctr == 2) {
         sub.pause();
-        new Future.delayed(const Duration(milliseconds: 25)).then((_) {
+        Future.delayed(const Duration(milliseconds: 25)).then((_) {
           sub.resume();
         });
       }
diff --git a/test/stream_zip_zone_test.dart b/test/stream_zip_zone_test.dart
index a0773a6..c7756e6 100644
--- a/test/stream_zip_zone_test.dart
+++ b/test/stream_zip_zone_test.dart
@@ -10,19 +10,19 @@
 
 main() {
   StreamController controller;
-  controller = new StreamController();
+  controller = StreamController();
   testStream("singlesub-async", controller, controller.stream);
-  controller = new StreamController.broadcast();
+  controller = StreamController.broadcast();
   testStream("broadcast-async", controller, controller.stream);
-  controller = new StreamController();
+  controller = StreamController();
   testStream(
       "asbroadcast-async", controller, controller.stream.asBroadcastStream());
 
-  controller = new StreamController(sync: true);
+  controller = StreamController(sync: true);
   testStream("singlesub-sync", controller, controller.stream);
-  controller = new StreamController.broadcast(sync: true);
+  controller = StreamController.broadcast(sync: true);
   testStream("broadcast-sync", controller, controller.stream);
-  controller = new StreamController(sync: true);
+  controller = StreamController(sync: true);
   testStream(
       "asbroadcast-sync", controller, controller.stream.asBroadcastStream());
 }
diff --git a/test/subscription_stream_test.dart b/test/subscription_stream_test.dart
index 804e92f..9460dec 100644
--- a/test/subscription_stream_test.dart
+++ b/test/subscription_stream_test.dart
@@ -13,7 +13,7 @@
   test("subscription stream of an entire subscription", () async {
     var stream = createStream();
     var subscription = stream.listen(null);
-    var subscriptionStream = new SubscriptionStream<int>(subscription);
+    var subscriptionStream = SubscriptionStream<int>(subscription);
     await flushMicrotasks();
     expect(subscriptionStream.toList(), completion([1, 2, 3, 4]));
   });
@@ -21,13 +21,13 @@
   test("subscription stream after two events", () async {
     var stream = createStream();
     var skips = 0;
-    var completer = new Completer();
+    var completer = Completer();
     StreamSubscription<int> subscription;
     subscription = stream.listen((value) {
       ++skips;
       expect(value, skips);
       if (skips == 2) {
-        completer.complete(new SubscriptionStream<int>(subscription));
+        completer.complete(SubscriptionStream<int>(subscription));
       }
     });
     var subscriptionStream = await completer.future;
@@ -38,16 +38,16 @@
   test("listening twice fails", () async {
     var stream = createStream();
     var sourceSubscription = stream.listen(null);
-    var subscriptionStream = new SubscriptionStream<int>(sourceSubscription);
+    var subscriptionStream = SubscriptionStream<int>(sourceSubscription);
     var subscription = subscriptionStream.listen(null);
     expect(() => subscriptionStream.listen(null), throwsA(anything));
     await subscription.cancel();
   });
 
   test("pause and cancel passed through to original stream", () async {
-    var controller = new StreamController(onCancel: () async => 42);
+    var controller = StreamController(onCancel: () async => 42);
     var sourceSubscription = controller.stream.listen(null);
-    var subscriptionStream = new SubscriptionStream(sourceSubscription);
+    var subscriptionStream = SubscriptionStream(sourceSubscription);
     expect(controller.isPaused, isTrue);
     dynamic lastEvent;
     var subscription = subscriptionStream.listen((value) {
@@ -75,16 +75,16 @@
         SubscriptionStream subscriptionStream;
         Future onCancel; // Completes if source stream is canceled before done.
         setUp(() {
-          var cancelCompleter = new Completer();
+          var cancelCompleter = Completer();
           var source = createErrorStream(cancelCompleter);
           onCancel = cancelCompleter.future;
           var sourceSubscription =
               source.listen(null, cancelOnError: sourceCancels);
-          subscriptionStream = new SubscriptionStream<int>(sourceSubscription);
+          subscriptionStream = SubscriptionStream<int>(sourceSubscription);
         });
 
         test("- subscriptionStream: no", () async {
-          var done = new Completer();
+          var done = Completer();
           var events = [];
           subscriptionStream.listen(events.add,
               onError: events.add, onDone: done.complete, cancelOnError: false);
@@ -96,7 +96,7 @@
             done.future.then((_) {
               isDone = true;
             });
-            await new Future.delayed(const Duration(milliseconds: 5));
+            await Future.delayed(const Duration(milliseconds: 5));
             expect(isDone, false);
           } else {
             expected.add(4);
@@ -106,7 +106,7 @@
         });
 
         test("- subscriptionStream: yes", () async {
-          var completer = new Completer();
+          var completer = Completer();
           var events = [];
           subscriptionStream.listen(events.add,
               onError: (value) {
@@ -128,7 +128,7 @@
           var stream = createStream();
           var sourceSubscription =
               stream.listen(null, cancelOnError: cancelOnError);
-          var subscriptionStream = new SubscriptionStream(sourceSubscription);
+          var subscriptionStream = SubscriptionStream(sourceSubscription);
           var subscription =
               subscriptionStream.listen(null, cancelOnError: cancelOnError);
           expect(subscription.asFuture(42), completion(42));
@@ -138,7 +138,7 @@
           var stream = createErrorStream();
           var sourceSubscription =
               stream.listen(null, cancelOnError: cancelOnError);
-          var subscriptionStream = new SubscriptionStream(sourceSubscription);
+          var subscriptionStream = SubscriptionStream(sourceSubscription);
 
           var subscription =
               subscriptionStream.listen(null, cancelOnError: cancelOnError);
@@ -166,7 +166,7 @@
     await flushMicrotasks();
     yield 2;
     await flushMicrotasks();
-    yield* new Future<int>.error("To err is divine!").asStream();
+    yield* Future<int>.error("To err is divine!").asStream();
     await flushMicrotasks();
     yield 4;
     await flushMicrotasks();
diff --git a/test/subscription_transformer_test.dart b/test/subscription_transformer_test.dart
index dbbf597..2a709a4 100644
--- a/test/subscription_transformer_test.dart
+++ b/test/subscription_transformer_test.dart
@@ -13,8 +13,8 @@
   group("with no callbacks", () {
     test("forwards cancellation", () async {
       var isCanceled = false;
-      var cancelCompleter = new Completer();
-      var controller = new StreamController(onCancel: expectAsync0(() {
+      var cancelCompleter = Completer();
+      var controller = StreamController(onCancel: expectAsync0(() {
         isCanceled = true;
         return cancelCompleter.future;
       }));
@@ -40,7 +40,7 @@
     });
 
     test("forwards pausing and resuming", () async {
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer())
           .listen(expectAsync1((_) {}, count: 0));
@@ -63,12 +63,12 @@
     });
 
     test("forwards pausing with a resume future", () async {
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer())
           .listen(expectAsync1((_) {}, count: 0));
 
-      var completer = new Completer();
+      var completer = Completer();
       subscription.pause(completer.future);
       await flushMicrotasks();
       expect(controller.isPaused, isTrue);
@@ -83,7 +83,7 @@
     test("invokes the callback when the subscription is canceled", () async {
       var isCanceled = false;
       var callbackInvoked = false;
-      var controller = new StreamController(onCancel: expectAsync0(() {
+      var controller = StreamController(onCancel: expectAsync0(() {
         isCanceled = true;
       }));
       var subscription = controller.stream.transform(
@@ -103,8 +103,8 @@
     });
 
     test("invokes the callback once and caches its result", () async {
-      var completer = new Completer();
-      var controller = new StreamController();
+      var completer = Completer();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer(
               handleCancel: expectAsync1((inner) => completer.future)))
@@ -134,7 +134,7 @@
   group("with a pause callback", () {
     test("invokes the callback when pause is called", () async {
       var pauseCount = 0;
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer(
               handlePause: expectAsync1((inner) {
@@ -166,7 +166,7 @@
 
     test("doesn't invoke the callback when the subscription has been canceled",
         () async {
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer(
               handlePause: expectAsync1((_) {}, count: 0)))
@@ -182,7 +182,7 @@
   group("with a resume callback", () {
     test("invokes the callback when resume is called", () async {
       var resumeCount = 0;
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer(
               handleResume: expectAsync1((inner) {
@@ -214,14 +214,14 @@
 
     test("invokes the callback when a resume future completes", () async {
       var resumed = false;
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream.transform(
           subscriptionTransformer(handleResume: expectAsync1((inner) {
         resumed = true;
         inner.resume();
       }))).listen(expectAsync1((_) {}, count: 0));
 
-      var completer = new Completer();
+      var completer = Completer();
       subscription.pause(completer.future);
       await flushMicrotasks();
       expect(resumed, isFalse);
@@ -233,7 +233,7 @@
 
     test("doesn't invoke the callback when the subscription has been canceled",
         () async {
-      var controller = new StreamController();
+      var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer(
               handlePause: expectAsync1((_) {}, count: 0)))
@@ -249,7 +249,7 @@
   group("when the outer subscription is canceled but the inner is not", () {
     StreamSubscription subscription;
     setUp(() {
-      var controller = new StreamController();
+      var controller = StreamController();
       subscription = controller.stream
           .transform(subscriptionTransformer(handleCancel: (_) {}))
           .listen(expectAsync1((_) {}, count: 0),
diff --git a/test/typed_wrapper/stream_subscription_test.dart b/test/typed_wrapper/stream_subscription_test.dart
index 50c07b6..bbec8f7 100644
--- a/test/typed_wrapper/stream_subscription_test.dart
+++ b/test/typed_wrapper/stream_subscription_test.dart
@@ -15,11 +15,10 @@
     StreamSubscription wrapper;
     bool isCanceled;
     setUp(() {
-      controller = new StreamController<Object>(onCancel: () {
+      controller = StreamController<Object>(onCancel: () {
         isCanceled = true;
       });
-      wrapper =
-          new TypeSafeStreamSubscription<int>(controller.stream.listen(null));
+      wrapper = TypeSafeStreamSubscription<int>(controller.stream.listen(null));
     });
 
     test("onData()", () {
@@ -72,11 +71,10 @@
     StreamSubscription wrapper;
     bool isCanceled;
     setUp(() {
-      controller = new StreamController<Object>(onCancel: () {
+      controller = StreamController<Object>(onCancel: () {
         isCanceled = true;
       });
-      wrapper =
-          new TypeSafeStreamSubscription<int>(controller.stream.listen(null));
+      wrapper = TypeSafeStreamSubscription<int>(controller.stream.listen(null));
     });
 
     group("throws a CastError for", () {
@@ -84,9 +82,9 @@
         expect(() {
           // TODO(nweiz): Use the wrapper declared in setUp when sdk#26226 is
           // fixed.
-          controller = new StreamController<Object>();
-          wrapper = new TypeSafeStreamSubscription<int>(
-              controller.stream.listen(null));
+          controller = StreamController<Object>();
+          wrapper =
+              TypeSafeStreamSubscription<int>(controller.stream.listen(null));
 
           wrapper.onData(expectAsync1((_) {}, count: 0));
           controller.add("foo");
diff --git a/test/utils.dart b/test/utils.dart
index 3f8c0ef..e517c78 100644
--- a/test/utils.dart
+++ b/test/utils.dart
@@ -9,9 +9,9 @@
 import "package:test/test.dart";
 
 /// A zero-millisecond timer should wait until after all microtasks.
-Future flushMicrotasks() => new Future.delayed(Duration.zero);
+Future flushMicrotasks() => Future.delayed(Duration.zero);
 
-typedef void OptionalArgAction([a, b]);
+typedef OptionalArgAction = void Function([dynamic a, dynamic b]);
 
 /// A generic unreachable callback function.
 ///
@@ -38,17 +38,17 @@
 
 /// A matcher that runs a callback in its own zone and asserts that that zone
 /// emits a [CastError].
-final throwsZonedCastError = throwsZoned(new TypeMatcher<CastError>());
+final throwsZonedCastError = throwsZoned(TypeMatcher<CastError>());
 
 /// A matcher that matches a callback or future that throws a [CastError].
-final throwsCastError = throwsA(new TypeMatcher<CastError>());
+final throwsCastError = throwsA(TypeMatcher<CastError>());
 
 /// A badly behaved stream which throws if it's ever listened to.
 ///
 /// Can be used to test cases where a stream should not be used.
 class UnusableStream extends Stream {
   listen(onData, {onError, onDone, cancelOnError}) {
-    throw new UnimplementedError("Gotcha!");
+    throw UnimplementedError("Gotcha!");
   }
 }
 
@@ -58,7 +58,7 @@
 /// The [completer] field allows the user to control the future returned by
 /// [done] and [close].
 class CompleterStreamSink<T> implements StreamSink<T> {
-  final completer = new Completer();
+  final completer = Completer();
 
   Future get done => completer.future;
 
@@ -80,7 +80,7 @@
   var _isClosed = false;
 
   Future get done => _doneCompleter.future;
-  final _doneCompleter = new Completer();
+  final _doneCompleter = Completer();
 
   final Function _onDone;
 
@@ -91,22 +91,22 @@
   TestSink({onDone()}) : _onDone = onDone ?? (() {});
 
   void add(T event) {
-    results.add(new Result<T>.value(event));
+    results.add(Result<T>.value(event));
   }
 
   void addError(error, [StackTrace stackTrace]) {
-    results.add(new Result<T>.error(error, stackTrace));
+    results.add(Result<T>.error(error, stackTrace));
   }
 
   Future addStream(Stream<T> stream) {
-    var completer = new Completer.sync();
+    var completer = Completer.sync();
     stream.listen(add, onError: addError, onDone: completer.complete);
     return completer.future;
   }
 
   Future close() {
     _isClosed = true;
-    _doneCompleter.complete(new Future.microtask(_onDone));
+    _doneCompleter.complete(Future.microtask(_onDone));
     return done;
   }
 }
