diff --git a/test/list_change_test.dart b/test/list_change_test.dart
index 2c7446e..cf2ac53 100644
--- a/test/list_change_test.dart
+++ b/test/list_change_test.dart
@@ -12,21 +12,19 @@
 // This file contains code ported from:
 // https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
 
-main() => listChangeTests();
-
 // TODO(jmesserly): port or write array fuzzer tests
-listChangeTests() {
+void main() {
   StreamSubscription sub;
-  var model;
+  ObservableList model;
 
-  tearDown(() {
-    sub?.cancel();
+  tearDown(() async {
+    await sub?.cancel();
     model = null;
   });
 
   _delta(i, r, a) => new ListChangeRecord(model, i, removed: r, addedCount: a);
 
-  test('sequential adds', () {
+  test('sequential adds', () async {
     model = toObservable([]);
     model.add(0);
 
@@ -37,38 +35,42 @@
     model.add(2);
 
     expect(summary, null);
-    return new Future(() => expectChanges(summary, [_delta(1, [], 2)]));
+    await newMicrotask();
+    expectChanges(summary, [_delta(1, [], 2)]);
   });
 
-  test('List Splice Truncate And Expand With Length', () {
+  test('List Splice Truncate And Expand With Length', () async {
     model = toObservable(['a', 'b', 'c', 'd', 'e']);
 
     var summary;
     sub = model.listChanges.listen((r) => summary = r);
 
     model.length = 2;
-    return new Future(() {
-      expectChanges(summary, [
-        _delta(2, ['c', 'd', 'e'], 0)
-      ]);
-      summary = null;
-      model.length = 5;
-    }).then(newMicrotask).then((_) {
-      expectChanges(summary, [_delta(2, [], 3)]);
-    });
+
+    await newMicrotask();
+    expectChanges(summary, [
+      _delta(2, ['c', 'd', 'e'], 0)
+    ]);
+    summary = null;
+    model.length = 5;
+
+    await newMicrotask();
+
+    expectChanges(summary, [_delta(2, [], 3)]);
   });
 
   group('List deltas can be applied', () {
-    applyAndCheckDeltas(model, copy, changes) => changes.then((summary) {
-          // apply deltas to the copy
-          for (ListChangeRecord delta in summary) {
-            delta.apply(copy);
-          }
+    Future applyAndCheckDeltas(model, copy, Future changes) async {
+      var summary = await changes;
+      // apply deltas to the copy
+      for (ListChangeRecord delta in summary) {
+        delta.apply(copy);
+      }
 
-          expect('$copy', '$model', reason: 'summary $summary');
-        });
+      expect('$copy', '$model', reason: 'summary $summary');
+    }
 
-    test('Contained', () {
+    test('Contained', () async {
       var model = toObservable(['a', 'b']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -78,10 +80,10 @@
       model.removeRange(1, 3);
       model.insert(1, 'f');
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Delete Empty', () {
+    test('Delete Empty', () async {
       var model = toObservable([1]);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -89,10 +91,10 @@
       model.removeAt(0);
       model.insertAll(0, ['a', 'b', 'c']);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Right Non Overlap', () {
+    test('Right Non Overlap', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -102,10 +104,10 @@
       model.removeRange(2, 3);
       model.insertAll(2, ['f', 'g']);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Left Non Overlap', () {
+    test('Left Non Overlap', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -115,10 +117,10 @@
       model.removeRange(0, 1);
       model.insert(0, 'e');
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Right Adjacent', () {
+    test('Right Adjacent', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -128,10 +130,10 @@
       model.removeRange(2, 3);
       model.insertAll(0, ['f', 'g']);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Left Adjacent', () {
+    test('Left Adjacent', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -142,10 +144,10 @@
       model.removeAt(1);
       model.insertAll(1, ['f', 'g']);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Right Overlap', () {
+    test('Right Overlap', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -155,10 +157,10 @@
       model.removeAt(1);
       model.insertAll(1, ['f', 'g']);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Left Overlap', () {
+    test('Left Overlap', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -170,10 +172,10 @@
       model.insertAll(1, ['h', 'i', 'j']);
       // a [h i j] f g d
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Prefix And Suffix One In', () {
+    test('Prefix And Suffix One In', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -181,20 +183,20 @@
       model.insert(0, 'z');
       model.add('z');
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Remove First', () {
+    test('Remove First', () async {
       var model = toObservable([16, 15, 15]);
       var copy = model.toList();
       var changes = model.listChanges.first;
 
       model.removeAt(0);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Update Remove', () {
+    test('Update Remove', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
@@ -204,60 +206,61 @@
       model[0] = 'h';
       model.removeAt(1);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
 
-    test('Remove Mid List', () {
+    test('Remove Mid List', () async {
       var model = toObservable(['a', 'b', 'c', 'd']);
       var copy = model.toList();
       var changes = model.listChanges.first;
 
       model.removeAt(2);
 
-      return applyAndCheckDeltas(model, copy, changes);
+      await applyAndCheckDeltas(model, copy, changes);
     });
   });
 
   group('edit distance', () {
-    assertEditDistance(orig, changes, expectedDist) => changes.then((summary) {
-          var actualDistance = 0;
-          for (var delta in summary) {
-            actualDistance += delta.addedCount + delta.removed.length;
-          }
+    Future assertEditDistance(orig, Future changes, expectedDist) async {
+      var summary = await changes;
+      var actualDistance = 0;
+      for (var delta in summary) {
+        actualDistance += delta.addedCount + delta.removed.length;
+      }
 
-          expect(actualDistance, expectedDist);
-        });
+      expect(actualDistance, expectedDist);
+    }
 
-    test('add items', () {
+    test('add items', () async {
       var model = toObservable([]);
       var changes = model.listChanges.first;
       model.addAll([1, 2, 3]);
-      return assertEditDistance(model, changes, 3);
+      await assertEditDistance(model, changes, 3);
     });
 
-    test('trunacte and add, sharing a contiguous block', () {
+    test('trunacte and add, sharing a contiguous block', () async {
       var model = toObservable(['x', 'x', 'x', 'x', '1', '2', '3']);
       var changes = model.listChanges.first;
       model.length = 0;
       model.addAll(['1', '2', '3', 'y', 'y', 'y', 'y']);
-      return assertEditDistance(model, changes, 8);
+      await assertEditDistance(model, changes, 8);
     });
 
-    test('truncate and add, sharing a discontiguous block', () {
+    test('truncate and add, sharing a discontiguous block', () async {
       var model = toObservable(['1', '2', '3', '4', '5']);
       var changes = model.listChanges.first;
       model.length = 0;
       model.addAll(['a', '2', 'y', 'y', '4', '5', 'z', 'z']);
-      return assertEditDistance(model, changes, 7);
+      await assertEditDistance(model, changes, 7);
     });
 
-    test('insert at beginning and end', () {
+    test('insert at beginning and end', () async {
       var model = toObservable([2, 3, 4]);
       var changes = model.listChanges.first;
       model.insert(0, 5);
       model[2] = 6;
       model.add(7);
-      return assertEditDistance(model, changes, 4);
+      await assertEditDistance(model, changes, 4);
     });
   });
 }
diff --git a/test/observable_map_test.dart b/test/observable_map_test.dart
index 795328b..bddc091 100644
--- a/test/observable_map_test.dart
+++ b/test/observable_map_test.dart
@@ -9,9 +9,7 @@
 
 import 'observable_test_utils.dart';
 
-main() => _runTests();
-
-_runTests() {
+void main() {
   // TODO(jmesserly): need all standard Map API tests.
 
   StreamSubscription sub;
diff --git a/test/observable_test.dart b/test/observable_test.dart
index fb07552..c902ba8 100644
--- a/test/observable_test.dart
+++ b/test/observable_test.dart
@@ -9,18 +9,16 @@
 
 import 'observable_test_utils.dart';
 
-main() => observableTests();
-
-void observableTests() {
+void main() {
   // Track the subscriptions so we can clean them up in tearDown.
-  List subs;
+  List<StreamSubscription> subs;
 
   setUp(() {
-    subs = [];
+    subs = <StreamSubscription>[];
   });
 
-  tearDown(() {
-    for (var sub in subs) sub.cancel();
+  tearDown(() async {
+    for (var sub in subs) await sub.cancel();
   });
 
   test('no observers', () {
@@ -83,7 +81,7 @@
     t.value = 42;
   });
 
-  test('async processing model', () {
+  test('async processing model', () async {
     var t = createModel(123);
     var records = [];
     subs.add(t.changes.listen((r) {
@@ -93,15 +91,16 @@
     t.value = 42;
     expectChanges(records, [], reason: 'changes delived async');
 
-    return new Future(() {
-      expectPropertyChanges(records, 2);
-      records.clear();
+    await newMicrotask();
 
-      t.value = 777;
-      expectChanges(records, [], reason: 'changes delived async');
-    }).then(newMicrotask).then((_) {
-      expectPropertyChanges(records, 1);
-    });
+    expectPropertyChanges(records, 2);
+    records.clear();
+
+    t.value = 777;
+    expectChanges(records, [], reason: 'changes delived async');
+
+    await newMicrotask();
+    expectPropertyChanges(records, 1);
   });
 
   test('cancel listening', () {
diff --git a/test/observable_test_utils.dart b/test/observable_test_utils.dart
index 9ce9161..91164c8 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();
+Future newMicrotask() => new Future.value();
 
 // TODO(jmesserly): use matchers when we have a way to compare ChangeRecords.
 // For now just use the toString.
