diff --git a/lib/src/change_notifier.dart b/lib/src/change_notifier.dart
index 2aeaf63..a093d01 100644
--- a/lib/src/change_notifier.dart
+++ b/lib/src/change_notifier.dart
@@ -23,7 +23,7 @@
   /// Changes should produced in order, if significant.
   @override
   Stream<List<C>> get changes {
-    return (_changes ??= new StreamController<List<C>>.broadcast(
+    return (_changes ??= StreamController<List<C>>.broadcast(
       sync: true,
       onListen: observed,
       onCancel: unobserved,
@@ -96,7 +96,7 @@
     T oldValue,
     T newValue,
   ) {
-    throw new UnsupportedError('Not supported by ChangeNotifier');
+    throw UnsupportedError('Not supported by ChangeNotifier');
   }
 }
 
@@ -117,7 +117,7 @@
   ) {
     if (hasObservers && oldValue != newValue) {
       notifyChange(
-        new PropertyChangeRecord<T>(
+        PropertyChangeRecord<T>(
           this,
           field,
           oldValue,
diff --git a/lib/src/differs/list_differ.dart b/lib/src/differs/list_differ.dart
index c59830e..712d065 100644
--- a/lib/src/differs/list_differ.dart
+++ b/lib/src/differs/list_differ.dart
@@ -59,11 +59,11 @@
   // 'Deletion' columns.
   final rowCount = oldEnd - oldStart + 1;
   final columnCount = currentEnd - currentStart + 1;
-  final distances = new List<List<int>>(rowCount);
+  final distances = List<List<int>>(rowCount);
 
   // 'Addition' rows. Initialize null column.
   for (var i = 0; i < rowCount; i++) {
-    distances[i] = new List<int>(columnCount);
+    distances[i] = List<int>(columnCount);
     distances[i][0] = i;
   }
 
@@ -212,7 +212,7 @@
   if (currentStart == currentEnd) {
     final spliceRemoved = old.sublist(oldStart, oldEnd);
     return [
-      new ListChangeRecord<E>.remove(
+      ListChangeRecord<E>.remove(
         current,
         currentStart,
         spliceRemoved,
@@ -221,7 +221,7 @@
   }
   if (oldStart == oldEnd) {
     return [
-      new ListChangeRecord<E>.add(
+      ListChangeRecord<E>.add(
         current,
         currentStart,
         currentEnd - currentStart,
@@ -259,7 +259,7 @@
     switch (op) {
       case _Edit.leave:
         if (hasSplice()) {
-          splices.add(new ListChangeRecord<E>(
+          splices.add(ListChangeRecord<E>(
             current,
             spliceIndex,
             removed: spliceRemovals,
@@ -296,7 +296,7 @@
     }
   }
   if (hasSplice()) {
-    splices.add(new ListChangeRecord<E>(
+    splices.add(ListChangeRecord<E>(
       current,
       spliceIndex,
       removed: spliceRemovals,
@@ -304,7 +304,7 @@
     ));
   }
   assert(() {
-    splices = new List<ListChangeRecord<E>>.unmodifiable(splices);
+    splices = List<ListChangeRecord<E>>.unmodifiable(splices);
     return true;
   }());
   return splices;
@@ -331,7 +331,7 @@
   // - then continues and updates the subsequent splices with any offset diff.
   for (var i = 0; i < splices.length; i++) {
     var current = splices[i];
-    current = splices[i] = new ListChangeRecord<E>(
+    current = splices[i] = ListChangeRecord<E>(
       current.object,
       current.index + insertionOffset,
       removed: current.removed,
@@ -386,7 +386,7 @@
       inserted = true;
       splices.insert(
         i,
-        new ListChangeRecord<E>(
+        ListChangeRecord<E>(
           record.object,
           spliceIndex,
           removed: spliceRemoved,
@@ -395,7 +395,7 @@
       );
       i++;
       final offset = spliceAdded - spliceRemoved.length;
-      current = splices[i] = new ListChangeRecord<E>(
+      current = splices[i] = ListChangeRecord<E>(
         current.object,
         current.index + offset,
         removed: current.removed,
@@ -405,7 +405,7 @@
     }
   }
   if (!inserted) {
-    splices.add(new ListChangeRecord<E>(
+    splices.add(ListChangeRecord<E>(
       record.object,
       spliceIndex,
       removed: spliceRemoved,
@@ -442,7 +442,7 @@
 List<ListChangeRecord<E>> projectListSplices<E>(
     List<E> list, List<ListChangeRecord<E>> records,
     [Equality<E> equality]) {
-  equality ??= new DefaultEquality<E>();
+  equality ??= DefaultEquality<E>();
   if (records.length <= 1) return records;
   final splices = <ListChangeRecord<E>>[];
   final initialSplices = _createInitialSplices(list, records);
diff --git a/lib/src/differs/map_differ.dart b/lib/src/differs/map_differ.dart
index 6f01fb7..46ffbd7 100644
--- a/lib/src/differs/map_differ.dart
+++ b/lib/src/differs/map_differ.dart
@@ -23,14 +23,14 @@
     oldValue.forEach((oldK, oldV) {
       final newV = newValue[oldK];
       if (newV == null && !newValue.containsKey(oldK)) {
-        changes.add(new MapChangeRecord<K, V>.remove(oldK, oldV));
+        changes.add(MapChangeRecord<K, V>.remove(oldK, oldV));
       } else if (newV != oldV) {
-        changes.add(new MapChangeRecord<K, V>(oldK, oldV, newV));
+        changes.add(MapChangeRecord<K, V>(oldK, oldV, newV));
       }
     });
     newValue.forEach((newK, newV) {
       if (!oldValue.containsKey(newK)) {
-        changes.add(new MapChangeRecord<K, V>.insert(newK, newV));
+        changes.add(MapChangeRecord<K, V>.insert(newK, newV));
       }
     });
     return freezeInDevMode(changes);
diff --git a/lib/src/internal.dart b/lib/src/internal.dart
index d600f50..ba59783 100644
--- a/lib/src/internal.dart
+++ b/lib/src/internal.dart
@@ -5,7 +5,7 @@
 List<E> freezeInDevMode<E>(List<E> list) {
   if (list == null) return const [];
   assert(() {
-    list = new List<E>.unmodifiable(list);
+    list = List<E>.unmodifiable(list);
     return true;
   }());
   return list;
diff --git a/lib/src/observable.dart b/lib/src/observable.dart
index edc536b..2f6e0f7 100644
--- a/lib/src/observable.dart
+++ b/lib/src/observable.dart
@@ -19,7 +19,7 @@
 /// - Implement the interface yourself and provide your own implementation
 abstract class Observable<C extends ChangeRecord> {
   // To be removed when https://github.com/dart-lang/observable/issues/10
-  final ChangeNotifier<C> _delegate = new ChangeNotifier<C>();
+  final ChangeNotifier<C> _delegate = ChangeNotifier<C>();
 
   // Whether Observable was not given a type.
   final bool _isNotGeneric = C == dynamic || C == ChangeRecord;
@@ -81,7 +81,7 @@
     if (hasObservers && oldValue != newValue) {
       if (_isNotGeneric) {
         notifyChange(
-          new PropertyChangeRecord(
+          PropertyChangeRecord(
             this,
             field,
             oldValue,
diff --git a/lib/src/observable_list.dart b/lib/src/observable_list.dart
index b7bd916..a502771 100644
--- a/lib/src/observable_list.dart
+++ b/lib/src/observable_list.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// ignore_for_file: deprecated_member_use_from_same_package
 library observable.src.observable_list;
 
 import 'dart:async';
@@ -27,7 +28,7 @@
   /// and if all elements stored into the returned list are actually instance
   /// of [S], then the returned list can be used as a `ObservableList<T>`.
   static ObservableList<T> castFrom<S, T>(ObservableList<S> source) =>
-      new ObservableList<T>._spy(source._list.cast<T>());
+      ObservableList<T>._spy(source._list.cast<T>());
 
   List<ListChangeRecord<E>> _listRecords;
 
@@ -44,7 +45,7 @@
   /// If a [length] argument is supplied, a fixed size list of that
   /// length is created.
   ObservableList([int length])
-      : _list = length != null ? new List<E>(length) : <E>[];
+      : _list = length != null ? List<E>(length) : <E>[];
 
   /// Creates an observable list of the given [length].
   ///
@@ -56,7 +57,7 @@
 
   /// Creates an observable list with the elements of [other]. The order in
   /// the list will be the order provided by the iterator of [other].
-  ObservableList.from(Iterable other) : _list = new List<E>.from(other);
+  ObservableList.from(Iterable other) : _list = List<E>.from(other);
 
   ObservableList._spy(List<E> other) : _list = other;
 
@@ -111,7 +112,7 @@
   Stream<List<ListChangeRecord<E>>> get listChanges {
     if (_listChanges == null) {
       // TODO(jmesserly): split observed/unobserved notions?
-      _listChanges = new StreamController.broadcast(
+      _listChanges = StreamController.broadcast(
         sync: true,
         onCancel: () {
           _listChanges = null;
@@ -234,7 +235,7 @@
   @override
   void insertAll(int index, Iterable<E> iterable) {
     if (index < 0 || index > length) {
-      throw new RangeError.range(index, 0, length);
+      throw RangeError.range(index, 0, length);
     }
     // TODO(floitsch): we can probably detect more cases.
     if (iterable is! List && iterable is! Set) {
@@ -260,7 +261,7 @@
   @override
   void insert(int index, E element) {
     if (index < 0 || index > length) {
-      throw new RangeError.range(index, 0, length);
+      throw RangeError.range(index, 0, length);
     }
     if (index == length) {
       add(element);
@@ -269,7 +270,7 @@
     // We are modifying the length just below the is-check. Without the check
     // Array.copy could throw an exception, leaving the list in a bad state
     // (with a length that has been increased, but without a new element).
-    if (index is! int) throw new ArgumentError(index);
+    if (index is! int) throw ArgumentError(index);
     _list.length++;
     _list.setRange(index + 1, length, this, index);
 
@@ -289,10 +290,10 @@
 
   void _rangeCheck(int start, int end) {
     if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
+      throw RangeError.range(start, 0, this.length);
     }
     if (end < start || end > this.length) {
-      throw new RangeError.range(end, start, this.length);
+      throw RangeError.range(end, start, this.length);
     }
   }
 
@@ -306,7 +307,7 @@
       _listRecords = [];
       scheduleMicrotask(deliverListChanges);
     }
-    _listRecords.add(new ListChangeRecord<E>(
+    _listRecords.add(ListChangeRecord<E>(
       this,
       index,
       removed: removed,
@@ -331,7 +332,7 @@
     _listRecords = null;
 
     if (hasListObservers && records.isNotEmpty) {
-      _listChanges.add(new UnmodifiableListView<ListChangeRecord<E>>(records));
+      _listChanges.add(UnmodifiableListView<ListChangeRecord<E>>(records));
       return true;
     }
     return false;
@@ -353,7 +354,7 @@
     List<E> oldValue,
     List<E> newValue,
   ) {
-    return new ListDiffer<E>().diff(oldValue, newValue);
+    return ListDiffer<E>().diff(oldValue, newValue);
   }
 
   /// Updates the [previous] list using the [changeRecords]. For added items,
@@ -361,7 +362,7 @@
   static void applyChangeRecords(List<Object> previous, List<Object> current,
       List<ListChangeRecord> changeRecords) {
     if (identical(previous, current)) {
-      throw new ArgumentError("can't use same list for previous and current");
+      throw ArgumentError("can't use same list for previous and current");
     }
 
     for (ListChangeRecord change in changeRecords) {
diff --git a/lib/src/observable_map.dart b/lib/src/observable_map.dart
index bb1c844..7410a31 100644
--- a/lib/src/observable_map.dart
+++ b/lib/src/observable_map.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// ignore_for_file: deprecated_member_use_from_same_package
 library observable.src.observable_map;
 
 import 'dart:collection';
@@ -35,19 +36,19 @@
   static ObservableMap<K2, V2> castFrom<K, V, K2, V2>(
     ObservableMap<K, V> source,
   ) {
-    return new ObservableMap<K2, V2>.spy(source._map.cast<K2, V2>());
+    return ObservableMap<K2, V2>.spy(source._map.cast<K2, V2>());
   }
 
   final Map<K, V> _map;
 
   /// Creates an observable map.
-  ObservableMap() : _map = new HashMap<K, V>();
+  ObservableMap() : _map = HashMap<K, V>();
 
   /// Creates a new observable map using a [LinkedHashMap].
-  ObservableMap.linked() : _map = new LinkedHashMap<K, V>();
+  ObservableMap.linked() : _map = LinkedHashMap<K, V>();
 
   /// Creates a new observable map using a [SplayTreeMap].
-  ObservableMap.sorted() : _map = new SplayTreeMap<K, V>();
+  ObservableMap.sorted() : _map = SplayTreeMap<K, V>();
 
   /// Creates an observable map that contains all key value pairs of [other].
   /// It will attempt to use the same backing map type if the other map is a
@@ -57,18 +58,18 @@
   /// Note this will perform a shallow conversion. If you want a deep conversion
   /// you should use [toObservable].
   factory ObservableMap.from(Map<K, V> other) {
-    return new ObservableMap<K, V>.createFromType(other)..addAll(other);
+    return ObservableMap<K, V>.createFromType(other)..addAll(other);
   }
 
   /// Like [ObservableMap.from], but creates an empty map.
   factory ObservableMap.createFromType(Map<K, V> other) {
     ObservableMap<K, V> result;
     if (other is SplayTreeMap) {
-      result = new ObservableMap<K, V>.sorted();
+      result = ObservableMap<K, V>.sorted();
     } else if (other is LinkedHashMap) {
-      result = new ObservableMap<K, V>.linked();
+      result = ObservableMap<K, V>.linked();
     } else {
-      result = new ObservableMap<K, V>();
+      result = ObservableMap<K, V>();
     }
     return result;
   }
@@ -114,10 +115,10 @@
 
     if (len != _map.length) {
       notifyPropertyChange(#length, len, _map.length);
-      notifyChange(new MapChangeRecord.insert(key, value));
+      notifyChange(MapChangeRecord.insert(key, value));
       _notifyKeysValuesChanged();
     } else if (oldValue != value) {
-      notifyChange(new MapChangeRecord(key, oldValue, value));
+      notifyChange(MapChangeRecord(key, oldValue, value));
       _notifyValuesChanged();
     }
   }
@@ -135,7 +136,7 @@
     V result = _map.putIfAbsent(key, ifAbsent);
     if (hasObservers && len != _map.length) {
       notifyPropertyChange(#length, len, _map.length);
-      notifyChange(new MapChangeRecord.insert(key, result));
+      notifyChange(MapChangeRecord.insert(key, result));
       _notifyKeysValuesChanged();
     }
     return result;
@@ -146,7 +147,7 @@
     int len = _map.length;
     V result = _map.remove(key);
     if (hasObservers && len != _map.length) {
-      notifyChange(new MapChangeRecord.remove(key, result));
+      notifyChange(MapChangeRecord.remove(key, result));
       notifyPropertyChange(#length, len, _map.length);
       _notifyKeysValuesChanged();
     }
@@ -158,7 +159,7 @@
     int len = _map.length;
     if (hasObservers && len > 0) {
       _map.forEach((key, value) {
-        notifyChange(new MapChangeRecord.remove(key, value));
+        notifyChange(MapChangeRecord.remove(key, value));
       });
       notifyPropertyChange(#length, len, 0);
       _notifyKeysValuesChanged();
@@ -211,11 +212,11 @@
   // Note: we don't really have a reasonable old/new value to use here.
   // But this should fix "keys" and "values" in templates with minimal overhead.
   void _notifyKeysValuesChanged() {
-    notifyChange(new PropertyChangeRecord(this, #keys, null, null));
+    notifyChange(PropertyChangeRecord(this, #keys, null, null));
     _notifyValuesChanged();
   }
 
   void _notifyValuesChanged() {
-    notifyChange(new PropertyChangeRecord(this, #values, null, null));
+    notifyChange(PropertyChangeRecord(this, #values, null, null));
   }
 }
diff --git a/lib/src/records/list_change_record.dart b/lib/src/records/list_change_record.dart
index beb7645..7f18716 100644
--- a/lib/src/records/list_change_record.dart
+++ b/lib/src/records/list_change_record.dart
@@ -30,13 +30,13 @@
     List<E> removed,
     int addedCount = 0,
   }) {
-    return new ListChangeRecord._(
-        object, index, removed ?? new UnmodifiableListView([]), addedCount);
+    return ListChangeRecord._(
+        object, index, removed ?? UnmodifiableListView([]), addedCount);
   }
 
   /// Records an `add` operation at `object[index]` of [addedCount] elements.
   ListChangeRecord.add(this.object, this.index, this.addedCount)
-      : removed = new UnmodifiableListView([]) {
+      : removed = UnmodifiableListView([]) {
     _assertValidState();
   }
 
@@ -83,16 +83,16 @@
   void _assertValidState() {
     assert(() {
       if (object == null) {
-        throw new ArgumentError.notNull('object');
+        throw ArgumentError.notNull('object');
       }
       if (index == null) {
-        throw new ArgumentError.notNull('index');
+        throw ArgumentError.notNull('index');
       }
       if (removed == null) {
-        throw new ArgumentError.notNull('removed');
+        throw ArgumentError.notNull('removed');
       }
       if (addedCount == null || addedCount < 0) {
-        throw new ArgumentError('Invalid `addedCount`: $addedCount');
+        throw ArgumentError('Invalid `addedCount`: $addedCount');
       }
       return true;
     }());
diff --git a/lib/src/to_observable.dart b/lib/src/to_observable.dart
index 20f8d7e..98432c2 100644
--- a/lib/src/to_observable.dart
+++ b/lib/src/to_observable.dart
@@ -41,7 +41,7 @@
 /// for a shallow conversion. This does not handle circular data structures.
 /// If a conversion is peformed, mutations are only observed to the result of
 /// this function. Changing the original collection will not affect it.
-ObservableList<T> toObservableList<T>(Iterable<T> value, {bool deep: true}) {
+ObservableList<T> toObservableList<T>(Iterable<T> value, {bool deep = true}) {
   if (value is Observable) return value;
   return deep ? _toObservableDeepIterable(value) : _toObservableShallow(value);
 }
@@ -57,7 +57,7 @@
 /// for a shallow conversion. This does not handle circular data structures.
 /// If a conversion is peformed, mutations are only observed to the result of
 /// this function. Changing the original collection will not affect it.
-ObservableMap<K, V> toObservableMap<K, V>(Map<K, V> value, {bool deep: true}) {
+ObservableMap<K, V> toObservableMap<K, V>(Map<K, V> value, {bool deep = true}) {
   if (value is Observable) return value;
   return deep ? _toObservableDeepMap(value) : _toObservableShallow(value);
 }
@@ -67,12 +67,12 @@
 
   if (value is Map) {
     return extractMapTypeArguments(
-        value, <K, V>() => new ObservableMap<K, V>.from(value));
+        value, <K, V>() => ObservableMap<K, V>.from(value));
   }
 
   if (value is Iterable) {
     return extractIterableTypeArgument(
-        value, <T>() => new ObservableList<T>.from(value));
+        value, <T>() => ObservableList<T>.from(value));
   }
 
   return value;
@@ -90,7 +90,7 @@
 
 ObservableMap _toObservableDeepMap(Map<dynamic, dynamic> value) {
   return extractMapTypeArguments(value, <K, V>() {
-    var result = new ObservableMap<K, V>.createFromType(value);
+    var result = ObservableMap<K, V>.createFromType(value);
     value.forEach((k, v) {
       result[_toObservableDeep(k)] = _toObservableDeep(v);
     });
@@ -100,7 +100,7 @@
 
 ObservableList _toObservableDeepIterable(Iterable<dynamic> value) {
   return extractIterableTypeArgument(value, <T>() {
-    var result = new ObservableList<T>();
+    var result = ObservableList<T>();
     for (var element in value) {
       result.add(_toObservableDeep(element));
     }
diff --git a/test/list_change_test.dart b/test/list_change_test.dart
index 4d47a72..fe53ccc 100644
--- a/test/list_change_test.dart
+++ b/test/list_change_test.dart
@@ -39,7 +39,7 @@
     model.add(2);
 
     expect(summary, null);
-    return new Future(() {
+    return Future(() {
       expect(summary, [_delta(1, [], 2, typedModel: model)]);
       expect(summary[0].added, [1, 2]);
       expect(summary[0].removed, []);
@@ -53,7 +53,7 @@
     sub = model.listChanges.listen((r) => summary = r);
 
     model.length = 2;
-    return new Future(() {
+    return Future(() {
       expect(summary, [
         _delta(2, ['c', 'd', 'e'], 0, typedModel: model)
       ]);
diff --git a/test/map_differ_test.dart b/test/map_differ_test.dart
index 7fb9ca9..40268e4 100644
--- a/test/map_differ_test.dart
+++ b/test/map_differ_test.dart
@@ -6,18 +6,18 @@
     final diff = const MapDiffer<String, String>().diff;
 
     test('should emit no changes for identical maps', () {
-      final map = new Map<String, String>.fromIterable(
-        new Iterable.generate(10, (i) => '$i'),
+      final map = Map<String, String>.fromIterable(
+        Iterable.generate(10, (i) => '$i'),
       );
       expect(diff(map, map), isEmpty);
     });
 
     test('should emit no changes for maps with identical content', () {
-      final map1 = new Map<String, String>.fromIterable(
-        new Iterable.generate(10, (i) => '$i'),
+      final map1 = Map<String, String>.fromIterable(
+        Iterable.generate(10, (i) => '$i'),
       );
-      final map2 = new Map<String, String>.fromIterable(
-        new Iterable.generate(10, (i) => '$i'),
+      final map2 = Map<String, String>.fromIterable(
+        Iterable.generate(10, (i) => '$i'),
       );
       expect(diff(map1, map2), isEmpty);
     });
@@ -33,7 +33,7 @@
           'key-c': 'value-c',
         }),
         [
-          new MapChangeRecord.insert('key-c', 'value-c'),
+          MapChangeRecord.insert('key-c', 'value-c'),
         ],
       );
     });
@@ -49,7 +49,7 @@
           'key-b': 'value-b',
         }),
         [
-          new MapChangeRecord.remove('key-c', 'value-c'),
+          MapChangeRecord.remove('key-c', 'value-c'),
         ],
       );
     });
@@ -64,7 +64,7 @@
           'key-b': 'value-b-new',
         }),
         [
-          new MapChangeRecord('key-b', 'value-b-old', 'value-b-new'),
+          MapChangeRecord('key-b', 'value-b-old', 'value-b-new'),
         ],
       );
     });
@@ -81,7 +81,7 @@
         'key-b': 'value-b',
         'key-c': 'value-c',
       };
-      new MapChangeRecord.insert('key-c', 'value-c').apply(map1);
+      MapChangeRecord.insert('key-c', 'value-c').apply(map1);
       expect(map1, map2);
     });
 
@@ -95,7 +95,7 @@
         'key-a': 'value-a',
         'key-b': 'value-b',
       };
-      new MapChangeRecord.remove('key-c', 'value-c').apply(map1);
+      MapChangeRecord.remove('key-c', 'value-c').apply(map1);
       expect(map1, map2);
     });
 
@@ -108,7 +108,7 @@
         'key-a': 'value-a',
         'key-b': 'value-b-new',
       };
-      new MapChangeRecord('key-b', 'value-b-old', 'value-b-new').apply(map1);
+      MapChangeRecord('key-b', 'value-b-old', 'value-b-new').apply(map1);
       expect(map1, map2);
     });
   });
diff --git a/test/observable_list_test.dart b/test/observable_list_test.dart
index fee070d..73573c4 100644
--- a/test/observable_list_test.dart
+++ b/test/observable_list_test.dart
@@ -42,7 +42,7 @@
     test('add changes length', () {
       list.add(4);
       expect(list, [1, 2, 3, 4]);
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(3, 4)]));
       });
     });
@@ -51,7 +51,7 @@
       list.remove(2);
       expect(list, orderedEquals([1, 3]));
 
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(3, 2)]));
       });
     });
@@ -60,7 +60,7 @@
       list.add(4);
       list.removeRange(1, 3);
       expect(list, [1, 4]);
-      return new Future(() {
+      return Future(() {
         expect(changes,
             changeMatchers([_lengthChange(3, 4), _lengthChange(4, 2)]));
       });
@@ -70,7 +70,7 @@
       list.add(2);
       list.removeWhere((e) => e == 2);
       expect(list, [1, 3]);
-      return new Future(() {
+      return Future(() {
         expect(changes,
             changeMatchers([_lengthChange(3, 4), _lengthChange(4, 2)]));
       });
@@ -79,7 +79,7 @@
     test('length= changes length', () {
       list.length = 5;
       expect(list, [1, 2, 3, null, null]);
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(3, 5)]));
       });
     });
@@ -87,7 +87,7 @@
     test('[]= does not change length', () {
       list[2] = 9000;
       expect(list, [1, 2, 9000]);
-      return new Future(() {
+      return Future(() {
         expect(changes, null);
       });
     });
@@ -95,7 +95,7 @@
     test('clear changes length', () {
       list.clear();
       expect(list, []);
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(3, 0)]));
       });
     });
@@ -117,7 +117,7 @@
     test('add does not change existing items', () {
       list.add(4);
       expect(list, [1, 2, 3, 4]);
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -125,7 +125,7 @@
     test('[]= changes item', () {
       list[1] = 777;
       expect(list, [1, 777, 3]);
-      return new Future(() {
+      return Future(() {
         expect(changes, [
           _change(1, addedCount: 1, removed: [2])
         ]);
@@ -135,7 +135,7 @@
     test('[]= on a different item does not fire change', () {
       list[2] = 9000;
       expect(list, [1, 2, 9000]);
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -144,7 +144,7 @@
       list[1] = 777;
       list[1] = 42;
       expect(list, [1, 42, 3]);
-      return new Future(() {
+      return Future(() {
         expect(changes, [
           _change(1, addedCount: 1, removed: [2]),
         ]);
@@ -154,7 +154,7 @@
     test('set length without truncating item means no change', () {
       list.length = 2;
       expect(list, [1, 2]);
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -162,7 +162,7 @@
     test('truncate removes item', () {
       list.length = 1;
       expect(list, [1]);
-      return new Future(() {
+      return Future(() {
         expect(changes, [
           _change(1, removed: [2, 3])
         ]);
@@ -173,7 +173,7 @@
       list.length = 1;
       list.add(42);
       expect(list, [1, 42]);
-      return new Future(() {
+      return Future(() {
         expect(changes, [
           _change(1, removed: [2, 3], addedCount: 1)
         ]);
@@ -184,7 +184,7 @@
       list.length = 1;
       list.add(2);
       expect(list, [1, 2]);
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -217,10 +217,10 @@
       expect(list.indexOf(1, 1), 3);
       expect(list.lastIndexOf(1), 3);
       expect(list.last, 4);
-      var copy = new List<int>();
+      var copy = List<int>();
       list.forEach((int i) => copy.add(i));
       expect(copy, orderedEquals([1, 2, 3, 1, 3, 4]));
-      return new Future(() {
+      return Future(() {
         // no change from read-only operators
         expect(propRecords, null);
         expect(listRecords, null);
@@ -232,7 +232,7 @@
       list.add(6);
       expect(list, orderedEquals([1, 2, 3, 1, 3, 4, 5, 6]));
 
-      return new Future(() {
+      return Future(() {
         expect(
             propRecords,
             changeMatchers([
@@ -247,7 +247,7 @@
       list[1] = list.last;
       expect(list, orderedEquals([1, 4, 3, 1, 3, 4]));
 
-      return new Future(() {
+      return Future(() {
         expect(propRecords, null);
         expect(listRecords, [
           _change(1, addedCount: 1, removed: [2])
@@ -259,7 +259,7 @@
       expect(list.removeLast(), 4);
       expect(list, orderedEquals([1, 2, 3, 1, 3]));
 
-      return new Future(() {
+      return Future(() {
         expect(propRecords, changeMatchers([_lengthChange(6, 5)]));
         expect(listRecords, [
           _change(5, removed: [4])
@@ -271,7 +271,7 @@
       list.removeRange(1, 4);
       expect(list, orderedEquals([1, 3, 4]));
 
-      return new Future(() {
+      return Future(() {
         expect(propRecords, changeMatchers([_lengthChange(6, 3)]));
         expect(listRecords, [
           _change(1, removed: [2, 3, 1])
@@ -283,7 +283,7 @@
       list.removeWhere((e) => e == 3);
       expect(list, orderedEquals([1, 2, 1, 4]));
 
-      return new Future(() {
+      return Future(() {
         expect(propRecords, changeMatchers([_lengthChange(6, 4)]));
         expect(listRecords, [
           _change(2, removed: [3]),
@@ -296,7 +296,7 @@
       list.sort((x, y) => x - y);
       expect(list, orderedEquals([1, 1, 2, 3, 3, 4]));
 
-      return new Future(() {
+      return Future(() {
         expect(propRecords, null);
         expect(listRecords, [
           _change(1, addedCount: 1),
@@ -323,7 +323,7 @@
       list.clear();
       expect(list, []);
 
-      return new Future(() {
+      return Future(() {
         expect(
             propRecords,
             changeMatchers([
@@ -342,7 +342,7 @@
 ObservableList<int> list;
 
 PropertyChangeRecord<int> _lengthChange(int oldValue, int newValue) =>
-    new PropertyChangeRecord<int>(list, #length, oldValue, newValue);
+    PropertyChangeRecord<int>(list, #length, oldValue, newValue);
 
 _change(int index, {List removed = const [], int addedCount = 0}) =>
-    new ListChangeRecord(list, index, removed: removed, addedCount: addedCount);
+    ListChangeRecord(list, index, removed: removed, addedCount: addedCount);
diff --git a/test/observable_map_test.dart b/test/observable_map_test.dart
index 1bc0062..569132e 100644
--- a/test/observable_map_test.dart
+++ b/test/observable_map_test.dart
@@ -40,7 +40,7 @@
     test('add item changes length', () {
       map['d'] = 4;
       expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(map, 3, 4)]));
       });
     });
@@ -48,7 +48,7 @@
     test('putIfAbsent changes length', () {
       map.putIfAbsent('d', () => 4);
       expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(map, 3, 4)]));
       });
     });
@@ -57,7 +57,7 @@
       map.remove('c');
       map.remove('a');
       expect(map, {'b': 2});
-      return new Future(() {
+      return Future(() {
         expect(
             changes,
             changeMatchers([
@@ -70,7 +70,7 @@
     test('remove non-existent item does not change length', () {
       map.remove('d');
       expect(map, {'a': 1, 'b': 2, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, null);
       });
     });
@@ -78,7 +78,7 @@
     test('set existing item does not change length', () {
       map['c'] = 9000;
       expect(map, {'a': 1, 'b': 2, 'c': 9000});
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -86,7 +86,7 @@
     test('clear changes length', () {
       map.clear();
       expect(map, {});
-      return new Future(() {
+      return Future(() {
         expect(changes, changeMatchers([_lengthChange(map, 3, 0)]));
       });
     });
@@ -110,7 +110,7 @@
     test('putIfAbsent new item does not change existing item', () {
       map.putIfAbsent('d', () => 4);
       expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -118,7 +118,7 @@
     test('set item to null', () {
       map['b'] = null;
       expect(map, {'a': 1, 'b': null, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, [_changeKey('b', 2, null)]);
       });
     });
@@ -126,7 +126,7 @@
     test('set item to value', () {
       map['b'] = 777;
       expect(map, {'a': 1, 'b': 777, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, [_changeKey('b', 2, 777)]);
       });
     });
@@ -134,7 +134,7 @@
     test('putIfAbsent does not change if already there', () {
       map.putIfAbsent('b', () => 1234);
       expect(map, {'a': 1, 'b': 2, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, null);
       });
     });
@@ -142,7 +142,7 @@
     test('change a different item', () {
       map['c'] = 9000;
       expect(map, {'a': 1, 'b': 2, 'c': 9000});
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -151,7 +151,7 @@
       map['b'] = 9001;
       map['b'] = 42;
       expect(map, {'a': 1, 'b': 42, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, [
           _changeKey('b', 2, 9001),
           _changeKey('b', 9001, 42),
@@ -162,7 +162,7 @@
     test('remove other items', () {
       map.remove('a');
       expect(map, {'b': 2, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, []);
       });
     });
@@ -170,7 +170,7 @@
     test('remove the item', () {
       map.remove('b');
       expect(map, {'a': 1, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, [_removeKey('b', 2)]);
       });
     });
@@ -179,7 +179,7 @@
       map.remove('b');
       map['b'] = 2;
       expect(map, {'a': 1, 'b': 2, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(changes, [
           _removeKey('b', 2),
           _insertKey('b', 2),
@@ -213,7 +213,7 @@
     test('add item changes keys/values', () {
       map['d'] = 4;
       expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
-      return new Future(() {
+      return Future(() {
         expect(keysChanged, 1);
         expect(valuesChanged, 1);
       });
@@ -222,7 +222,7 @@
     test('putIfAbsent changes keys/values', () {
       map.putIfAbsent('d', () => 4);
       expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
-      return new Future(() {
+      return Future(() {
         expect(keysChanged, 1);
         expect(valuesChanged, 1);
       });
@@ -232,7 +232,7 @@
       map.remove('c');
       map.remove('a');
       expect(map, {'b': 2});
-      return new Future(() {
+      return Future(() {
         expect(keysChanged, 2);
         expect(valuesChanged, 2);
       });
@@ -241,7 +241,7 @@
     test('remove non-existent item does not change keys/values', () {
       map.remove('d');
       expect(map, {'a': 1, 'b': 2, 'c': 3});
-      return new Future(() {
+      return Future(() {
         expect(keysChanged, 0);
         expect(valuesChanged, 0);
       });
@@ -250,7 +250,7 @@
     test('set existing item does not change keys', () {
       map['c'] = 9000;
       expect(map, {'a': 1, 'b': 2, 'c': 9000});
-      return new Future(() {
+      return Future(() {
         expect(keysChanged, 0);
         expect(valuesChanged, 1);
       });
@@ -259,7 +259,7 @@
     test('clear changes keys/values', () {
       map.clear();
       expect(map, {});
-      return new Future(() {
+      return Future(() {
         expect(keysChanged, 1);
         expect(valuesChanged, 1);
       });
@@ -290,7 +290,7 @@
       var copy = {};
       map.forEach((k, v) => copy[k] = v);
       expect(copy, {'a': 1, 'b': 2});
-      return new Future(() {
+      return Future(() {
         // no change from read-only operators
         expect(records, null);
 
@@ -306,7 +306,7 @@
       map.putIfAbsent('c', () => 3);
       expect(map, {'a': 1, 'b': 2, 'c': 3});
 
-      return new Future(() {
+      return Future(() {
         expect(
             records,
             changeMatchers([
@@ -325,7 +325,7 @@
       map['c'] = 3;
       expect(map, {'a': 42, 'b': 2, 'c': 3});
 
-      return new Future(() {
+      return Future(() {
         expect(
             records,
             changeMatchers([
@@ -343,7 +343,7 @@
       map.remove('b');
       expect(map, {'a': 1});
 
-      return new Future(() {
+      return Future(() {
         expect(
             records,
             changeMatchers([
@@ -359,7 +359,7 @@
       map.clear();
       expect(map, {});
 
-      return new Future(() {
+      return Future(() {
         expect(
             records,
             changeMatchers([
@@ -379,7 +379,7 @@
 
     setUp(() {
       delegate = {};
-      map = new ObservableMap.spy(delegate);
+      map = ObservableMap.spy(delegate);
     });
 
     test('[]=', () {
@@ -395,9 +395,9 @@
 MapChangeRecord _changeKey(key, old, newValue) =>
     MapChangeRecord(key, old, newValue);
 
-_insertKey(key, newValue) => new MapChangeRecord.insert(key, newValue);
+_insertKey(key, newValue) => MapChangeRecord.insert(key, newValue);
 
-_removeKey(key, oldValue) => new MapChangeRecord.remove(key, oldValue);
+_removeKey(key, oldValue) => MapChangeRecord.remove(key, oldValue);
 
 PropertyChangeRecord<Null> _propChange(map, prop) =>
-    new PropertyChangeRecord<Null>(map, prop, null, null);
+    PropertyChangeRecord<Null>(map, prop, null, null);
diff --git a/test/observable_test.dart b/test/observable_test.dart
index 094c718..e74660c 100644
--- a/test/observable_test.dart
+++ b/test/observable_test.dart
@@ -20,12 +20,14 @@
   });
 
   tearDown(() {
-    for (var sub in subs) sub.cancel();
+    for (var sub in subs) {
+      sub.cancel();
+    }
   });
 
   test('handle future result', () {
-    var callback = expectAsync(() {});
-    return new Future(callback);
+    var callback = expectAsync0(() {});
+    return Future(callback);
   });
 
   test('no observers', () {
@@ -48,7 +50,7 @@
     var t = createModel(123);
     int called = 0;
 
-    subs.add(t.changes.listen(expectAsync((records) {
+    subs.add(t.changes.listen(expectAsync1((records) {
       called++;
       expectPropertyChanges(records, 2);
     })));
@@ -62,7 +64,7 @@
     var t = createModel(123);
     int called = 0;
 
-    subs.add(t.changes.listen(expectAsync((records) {
+    subs.add(t.changes.listen(expectAsync1((records) {
       called++;
       expectPropertyChanges(records, 1);
       if (called == 1) {
@@ -81,8 +83,8 @@
       expectPropertyChanges(records, 2);
     }
 
-    subs.add(t.changes.listen(expectAsync(verifyRecords)));
-    subs.add(t.changes.listen(expectAsync(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync1(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync1(verifyRecords)));
 
     t.value = 41;
     t.value = 42;
@@ -98,7 +100,7 @@
     t.value = 42;
     expect(records, [], reason: 'changes delived async');
 
-    return new Future(() {
+    return Future(() {
       expectPropertyChanges(records, 2);
       records.clear();
 
@@ -112,7 +114,7 @@
   test('cancel listening', () {
     var t = createModel(123);
     var sub;
-    sub = t.changes.listen(expectAsync((records) {
+    sub = t.changes.listen(expectAsync1((records) {
       expectPropertyChanges(records, 1);
       sub.cancel();
       t.value = 777;
@@ -123,12 +125,12 @@
   test('cancel and reobserve', () {
     var t = createModel(123);
     var sub;
-    sub = t.changes.listen(expectAsync((records) {
+    sub = t.changes.listen(expectAsync1((records) {
       expectPropertyChanges(records, 1);
       sub.cancel();
 
       scheduleMicrotask(() {
-        subs.add(t.changes.listen(expectAsync((records) {
+        subs.add(t.changes.listen(expectAsync1((records) {
           expectPropertyChanges(records, 1);
         })));
         t.value = 777;
@@ -145,13 +147,13 @@
     }));
     t.value = 42;
 
-    return new Future(() {
+    return Future(() {
       expectPropertyChanges(records, 1);
 
       // Verify that mutation operations on the list fail:
 
       expect(() {
-        records[0] = new PropertyChangeRecord(t, #value, 0, 1);
+        records[0] = PropertyChangeRecord(t, #value, 0, 1);
       }, throwsUnsupportedError);
 
       expect(() {
@@ -170,9 +172,9 @@
     subs.add(t.changes.listen((r) {
       records.addAll(r);
     }));
-    t.notifyChange(new PropertyChangeRecord(t, #value, 123, 42));
+    t.notifyChange(PropertyChangeRecord(t, #value, 123, 42));
 
-    return new Future(() {
+    return Future(() {
       expectPropertyChanges(records, 1);
       expect(t.value, 123, reason: 'value did not actually change.');
     });
@@ -187,7 +189,7 @@
     expect(t.notifyPropertyChange(#value, t.value, 42), 42,
         reason: 'notifyPropertyChange returns newValue');
 
-    return new Future(() {
+    return Future(() {
       expectPropertyChanges(records, 1);
       expect(t.value, 123, reason: 'value did not actually change.');
     });
@@ -204,7 +206,7 @@
   }
 }
 
-createModel(int number) => new ObservableSubclass(number);
+createModel(int number) => ObservableSubclass(number);
 
 class ObservableSubclass<T> extends PropertyChangeNotifier {
   ObservableSubclass([T initialValue]) : _value = initialValue;
diff --git a/test/observable_test_utils.dart b/test/observable_test_utils.dart
index bbb5b70..b705e7c 100644
--- a/test/observable_test_utils.dart
+++ b/test/observable_test_utils.dart
@@ -13,7 +13,7 @@
 /// to happen in the next microtask:
 ///
 ///     future.then(newMicrotask).then(...)
-newMicrotask(_) => new Future.value();
+newMicrotask(_) => Future.value();
 
 void expectChanges(List<ChangeRecord> actual, List<ChangeRecord> expected,
     {String reason}) {
@@ -27,11 +27,11 @@
 
 List<ListChangeRecord> getListChangeRecords(
         List<ListChangeRecord> changes, int index) =>
-    new List.from(changes.where((ListChangeRecord c) => c.indexChanged(index)));
+    List.from(changes.where((ListChangeRecord c) => c.indexChanged(index)));
 
 List<PropertyChangeRecord> getPropertyChangeRecords(
         List<ChangeRecord> changes, Symbol property) =>
-    new List.from(changes.where(
+    List.from(changes.where(
         (ChangeRecord c) => c is PropertyChangeRecord && c.name == property));
 
 List<Matcher> changeMatchers(List<ChangeRecord> changes) => changes
